| 1234567891011121314151617181920212223242526272829303132333435363738394041 |
- # SPDX-License-Identifier: AGPL-3.0-only
- import asyncdispatch, httpclient
- type
- HttpPool* = ref object
- conns*: seq[AsyncHttpClient]
- var maxConns: int
- var proxy: Proxy
- proc setMaxHttpConns*(n: int) =
- maxConns = n
- proc setHttpProxy*(url: string; auth: string) =
- if url.len > 0:
- proxy = newProxy(url, auth)
- else:
- proxy = nil
- proc release*(pool: HttpPool; client: AsyncHttpClient) =
- if pool.conns.len >= maxConns:
- client.close()
- elif client != nil:
- pool.conns.insert(client)
- template use*(pool: HttpPool; heads: HttpHeaders; body: untyped): untyped =
- var c {.inject.}: AsyncHttpClient
- if pool.conns.len == 0:
- c = newAsyncHttpClient(headers=heads, proxy=proxy)
- else:
- c = pool.conns.pop()
- c.headers = heads
- try:
- body
- except ProtocolError:
- # Twitter closed the connection, retry
- body
- finally:
- pool.release(c)
|