Jelajahi Sumber

Simplify bad http client pruning

Zed 4 tahun lalu
induk
melakukan
79b98a8081
2 mengubah file dengan 14 tambahan dan 15 penghapusan
  1. 7 11
      src/apiutils.nim
  2. 7 4
      src/http_pool.nim

+ 7 - 11
src/apiutils.nim

@@ -58,17 +58,15 @@ template fetchImpl(result, fetchBody) {.dirty.} =
   if token.tok.len == 0:
     raise rateLimitError()
 
-  var
-    client = pool.acquire(genHeaders(token))
-    badClient = false
-
   try:
-    let resp = await client.get($url)
-    result = await resp.body
+    var resp: AsyncResponse
+    pool.use(genHeaders(token)):
+      resp = await c.get(url)
+      result = await resp.body
 
-    if resp.status == $Http503:
-      badClient = true
-      raise newException(InternalError, result)
+      if resp.status == $Http503:
+        badClient = true
+        raise newException(InternalError, result)
 
     if result.len > 0:
       if resp.headers.getOrDefault("content-encoding") == "gzip":
@@ -89,8 +87,6 @@ template fetchImpl(result, fetchBody) {.dirty.} =
     if "length" notin e.msg and "descriptor" notin e.msg:
       release(token, invalid=true)
     raise rateLimitError()
-  finally:
-    pool.release(client, badClient=badClient)
 
 proc fetch*(url: Uri; api: Api): Future[JsonNode] {.async.} =
   var body: string

+ 7 - 4
src/http_pool.nim

@@ -5,8 +5,9 @@ type
   HttpPool* = ref object
     conns*: seq[AsyncHttpClient]
 
-var maxConns: int
-var proxy: Proxy
+var
+  maxConns: int
+  proxy: Proxy
 
 proc setMaxHttpConns*(n: int) =
   maxConns = n
@@ -32,7 +33,9 @@ proc acquire*(pool: HttpPool; heads: HttpHeaders): AsyncHttpClient =
     result.headers = heads
 
 template use*(pool: HttpPool; heads: HttpHeaders; body: untyped): untyped =
-  let c {.inject.} = pool.acquire(heads)
+  var
+    c {.inject.} = pool.acquire(heads)
+    badClient {.inject.} = false
 
   try:
     body
@@ -40,4 +43,4 @@ template use*(pool: HttpPool; heads: HttpHeaders; body: untyped): untyped =
     # Twitter closed the connection, retry
     body
   finally:
-    pool.release(c)
+    pool.release(c, badClient)