From 3ce94ca09dbd9b6984698da83603bcc7a1e9ac7e Mon Sep 17 00:00:00 2001 From: DualFroz Date: Thu, 27 Aug 2026 23:36:28 +0200 Subject: [PATCH] fix: retry immediately on non-positive numeric Retry-After header The numeric Retry-After branch multiplied the header value by 1000 without guarding non-positive results, so `Retry-After: 0` produced a falsy delay that fell through to exponential backoff instead of retrying immediately. The RFC-1123 date branch already clamps non-positive values to 1ms; mirror that guard in the numeric branch so a non-positive Retry-After retries at once. --- source/core/index.ts | 4 ++++ test/retry.ts | 21 +++++++++++++++++++++ 2 files changed, 25 insertions(+) diff --git a/source/core/index.ts b/source/core/index.ts index a8a1561..7404ba5 100644 --- a/source/core/index.ts +++ b/source/core/index.ts @@ -532,6 +532,10 @@ export default class Request extends Duplex implements RequestEvents { } } else { retryAfter *= 1000; + + if (retryAfter <= 0) { + retryAfter = 1; + } } } diff --git a/test/retry.ts b/test/retry.ts index 0e50659..ce62069 100644 --- a/test/retry.ts +++ b/test/retry.ts @@ -304,6 +304,27 @@ test('retries on 503 without Retry-After header', withServer, async (t, server, t.is(retryCount, 1); }); +test('retries immediately on non-positive numeric Retry-After', withServer, async (t, server, got) => { + server.get('/', (_request, response) => { + response.writeHead(503, { + 'Retry-After': 0, + }); + response.end(); + }); + + const start = Date.now(); + const {statusCode, retryCount} = await got({ + throwHttpErrors: false, + retry: { + limit: 2, + }, + }); + + t.is(statusCode, 503); + t.is(retryCount, 2); + t.true(Date.now() - start < 1000); +}); + test('doesn\'t retry on streams', withServer, async (t, server, got) => { server.get('/', () => {});