# 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)
