![Zed](/assets/img/avatar_default.png)
* Update deps * Replace profile timeline with GraphQL endpoint * Update GraphQL endpoint versions * Use GraphQL for profile media tab * Fix UserByRestId request * Improve routing, fixes #814 * Fix token pool JSON * Deduplicate GraphQL timeline endpoints * Update list endpoints * Use GraphQL for list tweets * Remove debug leftover * Replace old pinned tweet endpoint with GraphQL * Validate tweet ID * Minor token handling fix * Hide US-only commerce cards * Update config example * Remove http pool and gzip from token pool * Support tombstoned tweets in threads * Retry GraphQL timeout errors * Remove unnecessary 401 retry * Remove broken timeout retry * Update karax, use new bool attribute feature * Update card test * Fix odd edgecase with broken retweets * Replace search endpoints, switch Bearer token * Only parse user search if it's a list * Fix quoted tweet crash * Fix empty search query handling * Fix invalid user search errors again
53 lines
1.2 KiB
Nim
53 lines
1.2 KiB
Nim
# SPDX-License-Identifier: AGPL-3.0-only
|
|
import httpclient
|
|
|
|
type
|
|
HttpPool* = ref object
|
|
conns*: seq[AsyncHttpClient]
|
|
|
|
var
|
|
maxConns: int
|
|
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; badClient=false) =
|
|
if pool.conns.len >= maxConns or badClient:
|
|
try: client.close()
|
|
except: discard
|
|
elif client != nil:
|
|
pool.conns.insert(client)
|
|
|
|
proc acquire*(pool: HttpPool; heads: HttpHeaders): AsyncHttpClient =
|
|
if pool.conns.len == 0:
|
|
result = newAsyncHttpClient(headers=heads, proxy=proxy)
|
|
else:
|
|
result = pool.conns.pop()
|
|
result.headers = heads
|
|
|
|
template use*(pool: HttpPool; heads: HttpHeaders; body: untyped): untyped =
|
|
var
|
|
c {.inject.} = pool.acquire(heads)
|
|
badClient {.inject.} = false
|
|
|
|
try:
|
|
body
|
|
except ProtocolError:
|
|
# Twitter closed the connection, retry
|
|
body
|
|
except BadClientError:
|
|
# Twitter returned 503, we need a new client
|
|
pool.release(c, true)
|
|
badClient = false
|
|
c = pool.acquire(heads)
|
|
body
|
|
finally:
|
|
pool.release(c, badClient)
|