Skip to content

Commit 64fa3e1

Browse files
authored
refactor(http-request): rename parseRetryAfter to parseRetryAfterHeader (#147)
Clarifies that this function parses an HTTP header value, not an arbitrary duration string. Sets a naming convention for future header parsers (e.g. parseCacheControlHeader).
1 parent ec1d199 commit 64fa3e1

2 files changed

Lines changed: 20 additions & 20 deletions

File tree

src/http-request.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -282,7 +282,7 @@ export interface HttpRequestOptions {
282282
* // Don't retry client errors (except 429)
283283
* if (error instanceof HttpResponseError) {
284284
* if (error.response.status === 429) {
285-
* const retryAfter = parseRetryAfter(error.response.headers['retry-after'])
285+
* const retryAfter = parseRetryAfterHeader(error.response.headers['retry-after'])
286286
* return retryAfter ?? undefined
287287
* }
288288
* if (error.response.status >= 400 && error.response.status < 500) {
@@ -548,13 +548,13 @@ export class HttpResponseError extends Error {
548548
*
549549
* @example
550550
* ```ts
551-
* const delay = parseRetryAfter(response.headers['retry-after'])
551+
* const delay = parseRetryAfterHeader(response.headers['retry-after'])
552552
* if (delay !== undefined) {
553553
* await new Promise(resolve => setTimeout(resolve, delay))
554554
* }
555555
* ```
556556
*/
557-
export function parseRetryAfter(
557+
export function parseRetryAfterHeader(
558558
value: string | string[] | undefined,
559559
): number | undefined {
560560
if (!value) {

test/unit/http-request.test.mts

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ import {
2626
httpRequest,
2727
httpText,
2828
parseChecksums,
29-
parseRetryAfter,
29+
parseRetryAfterHeader,
3030
readIncomingResponse,
3131
sanitizeHeaders,
3232
} from '@socketsecurity/lib/http-request'
@@ -2578,50 +2578,50 @@ abc123def456789012345678901234567890123456789012345678901234abcd
25782578
})
25792579
})
25802580

2581-
describe('parseRetryAfter', () => {
2581+
describe('parseRetryAfterHeader', () => {
25822582
it('should parse integer seconds', () => {
2583-
expect(parseRetryAfter('120')).toBe(120_000)
2583+
expect(parseRetryAfterHeader('120')).toBe(120_000)
25842584
})
25852585

25862586
it('should parse zero seconds', () => {
2587-
expect(parseRetryAfter('0')).toBe(0)
2587+
expect(parseRetryAfterHeader('0')).toBe(0)
25882588
})
25892589

25902590
it('should return undefined for undefined input', () => {
2591-
expect(parseRetryAfter(undefined)).toBeUndefined()
2591+
expect(parseRetryAfterHeader(undefined)).toBeUndefined()
25922592
})
25932593

25942594
it('should return undefined for empty string', () => {
2595-
expect(parseRetryAfter('')).toBeUndefined()
2595+
expect(parseRetryAfterHeader('')).toBeUndefined()
25962596
})
25972597

25982598
it('should return undefined for empty array', () => {
2599-
expect(parseRetryAfter([])).toBeUndefined()
2599+
expect(parseRetryAfterHeader([])).toBeUndefined()
26002600
})
26012601

26022602
it('should take first value from array', () => {
2603-
expect(parseRetryAfter(['60', '120'])).toBe(60_000)
2603+
expect(parseRetryAfterHeader(['60', '120'])).toBe(60_000)
26042604
})
26052605

26062606
it('should parse future HTTP-date', () => {
26072607
const future = new Date(Date.now() + 5000).toUTCString()
2608-
const result = parseRetryAfter(future)!
2608+
const result = parseRetryAfterHeader(future)!
26092609

26102610
expect(result).toBeGreaterThan(0)
26112611
expect(result).toBeLessThanOrEqual(6000)
26122612
})
26132613

26142614
it('should return undefined for past HTTP-date', () => {
26152615
const past = new Date(Date.now() - 60_000).toUTCString()
2616-
expect(parseRetryAfter(past)).toBeUndefined()
2616+
expect(parseRetryAfterHeader(past)).toBeUndefined()
26172617
})
26182618

26192619
it('should return undefined for negative seconds', () => {
2620-
expect(parseRetryAfter('-5')).toBeUndefined()
2620+
expect(parseRetryAfterHeader('-5')).toBeUndefined()
26212621
})
26222622

26232623
it('should return undefined for non-parseable string', () => {
2624-
expect(parseRetryAfter('not-a-number-or-date')).toBeUndefined()
2624+
expect(parseRetryAfterHeader('not-a-number-or-date')).toBeUndefined()
26252625
})
26262626
})
26272627

@@ -3001,7 +3001,7 @@ abc123def456789012345678901234567890123456789012345678901234abcd
30013001
retryDelay: 10,
30023002
onRetry: (_attempt, error) => {
30033003
if (error instanceof HttpResponseError) {
3004-
const retryAfter = parseRetryAfter(
3004+
const retryAfter = parseRetryAfterHeader(
30053005
error.response.headers['retry-after'],
30063006
)
30073007
return retryAfter ?? undefined
@@ -3059,10 +3059,10 @@ abc123def456789012345678901234567890123456789012345678901234abcd
30593059
})
30603060
})
30613061

3062-
describe('parseRetryAfter - additional edge cases', () => {
3062+
describe('parseRetryAfterHeader - additional edge cases', () => {
30633063
it('should reject partial numeric strings like "10abc"', () => {
30643064
// Strict parsing — "10abc" is not a valid delay-seconds value
3065-
expect(parseRetryAfter('10abc')).toBeUndefined()
3065+
expect(parseRetryAfterHeader('10abc')).toBeUndefined()
30663066
})
30673067
})
30683068

@@ -3115,10 +3115,10 @@ abc123def456789012345678901234567890123456789012345678901234abcd
31153115
})
31163116
})
31173117

3118-
describe('parseRetryAfter - whitespace', () => {
3118+
describe('parseRetryAfterHeader - whitespace', () => {
31193119
it('should handle whitespace-padded integer', () => {
31203120
// parseInt trims leading whitespace
3121-
expect(parseRetryAfter(' 60 ')).toBe(60_000)
3121+
expect(parseRetryAfterHeader(' 60 ')).toBe(60_000)
31223122
})
31233123
})
31243124

0 commit comments

Comments
 (0)