From 2ac3afa5b273a502d7632e9346c7c3bc9283fb48 Mon Sep 17 00:00:00 2001 From: Zed Date: Wed, 21 Sep 2022 05:47:16 +0200 Subject: [PATCH] Retry intermittent 401 Unauthorized requests --- src/apiutils.nim | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/src/apiutils.nim b/src/apiutils.nim index fd6960f..77ff368 100644 --- a/src/apiutils.nim +++ b/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 + template getContent = + resp = await c.get($url) + result = await resp.body - if resp.status == $Http503: - badClient = true - raise newException(InternalError, result) + 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":