Browse Source

Retry intermittent 401 Unauthorized requests

Zed 4 năm trước cách đây
mục cha
commit
2ac3afa5b2
1 tập tin đã thay đổi với 16 bổ sung6 xóa
  1. 16 6
      src/apiutils.nim

+ 16 - 6
src/apiutils.nim

@@ -61,12 +61,22 @@ template fetchImpl(result, fetchBody) {.dirty.} =
   try:
     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)
+      template getContent =
+        resp = await c.get($url)
+        result = await resp.body
+
+      getContent()
+
+      # Twitter randomly returns 401 errors with an empty body quite often.
+      # Retrying the request usually works.
+      var attempt = 0
+      while resp.status == "401 Unauthorized" and result.len == 0 and attempt < 3:
+        inc attempt
+        getContent()
+
+    if resp.status == $Http503:
+      badClient = true
+      raise newException(InternalError, result)
 
     if result.len > 0:
       if resp.headers.getOrDefault("content-encoding") == "gzip":