Skip to content

Commit 6855ff1

Browse files
committed
Fix HTTP/2 socket timeout handling
1 parent c6bbb8a commit 6855ff1

2 files changed

Lines changed: 32 additions & 4 deletions

File tree

‎source/core/index.ts‎

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -532,13 +532,13 @@ export default class Request extends Duplex implements RequestEvents<Request> {
532532
retryAfter = Number(response.headers['retry-after']);
533533
if (Number.isNaN(retryAfter)) {
534534
retryAfter = Date.parse(response.headers['retry-after']!) - Date.now();
535-
536-
if (retryAfter <= 0) {
537-
retryAfter = 1;
538-
}
539535
} else {
540536
retryAfter *= 1000;
541537
}
538+
539+
if (retryAfter <= 0) {
540+
retryAfter = 1;
541+
}
542542
}
543543

544544
const retryOptions = options.retry as RetryOptions;

‎test/retry.ts‎

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -337,6 +337,34 @@ test('respects 413 Retry-After', withServer, async (t, server, got) => {
337337
t.true(Number(body) >= retryAfterOn413 * 1000);
338338
});
339339

340+
for (const statusCode of [413, 429, 503]) {
341+
test(`retries immediately on ${statusCode} with Retry-After of 0`, withServer, async (t, server, got) => {
342+
let requestCount = 0;
343+
server.get('/', (_request, response) => {
344+
requestCount++;
345+
if (requestCount === 1) {
346+
response.writeHead(statusCode, {'Retry-After': '0'}).end();
347+
return;
348+
}
349+
350+
response.end('ok');
351+
});
352+
const response = await got({
353+
throwHttpErrors: false,
354+
retry: {
355+
limit: 1,
356+
calculateDelay({computedValue, retryAfter}) {
357+
t.is(retryAfter, 1);
358+
t.is(computedValue, 1);
359+
return 1;
360+
},
361+
},
362+
});
363+
t.is(response.statusCode, 200);
364+
t.is(response.retryCount, 1);
365+
});
366+
}
367+
340368
test('respects 413 Retry-After with RFC-1123 timestamp', withServer, async (t, server, got) => {
341369
let lastTried413TimestampAccess: string;
342370
server.get('/', (_request, response) => {

0 commit comments

Comments
 (0)