nitter/src/http_pool.nim

42 lines
909 B
Nim
Raw Normal View History

2021-12-27 01:37:38 +00:00
# SPDX-License-Identifier: AGPL-3.0-only
import asyncdispatch, httpclient
type
HttpPool* = ref object
conns*: seq[AsyncHttpClient]
var maxConns {.threadvar.}: int
2021-09-30 16:03:07 +00:00
var proxy {.threadvar.}: Proxy
proc setMaxHttpConns*(n: int) =
maxConns = n
2021-09-30 16:03:07 +00:00
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:
2021-09-30 16:03:07 +00:00
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)