UNPKG

@azure/core-rest-pipeline

Version:

Isomorphic client library for making HTTP requests in node.js and browser.

74 lines 3.1 kB
// Copyright (c) Microsoft Corporation. // Licensed under the MIT License. import { parseHeaderValueAsNumber } from "../util/helpers.js"; /** * The header that comes back from Azure services representing * the amount of time (minimum) to wait to retry (in seconds or timestamp after which we can retry). */ const RetryAfterHeader = "Retry-After"; /** * The headers that come back from Azure services representing * the amount of time (minimum) to wait to retry. * * "retry-after-ms", "x-ms-retry-after-ms" : milliseconds * "Retry-After" : seconds or timestamp */ const AllRetryAfterHeaders = ["retry-after-ms", "x-ms-retry-after-ms", RetryAfterHeader]; /** * A response is a throttling retry response if it has a throttling status code (429 or 503), * as long as one of the [ "Retry-After" or "retry-after-ms" or "x-ms-retry-after-ms" ] headers has a valid value. * * Returns the `retryAfterInMs` value if the response is a throttling retry response. * If not throttling retry response, returns `undefined`. * * @internal */ function getRetryAfterInMs(response) { if (!(response && [429, 503].includes(response.status))) return undefined; try { // Headers: "retry-after-ms", "x-ms-retry-after-ms", "Retry-After" for (const header of AllRetryAfterHeaders) { const retryAfterValue = parseHeaderValueAsNumber(response, header); if (retryAfterValue === 0 || retryAfterValue) { // "Retry-After" header ==> seconds // "retry-after-ms", "x-ms-retry-after-ms" headers ==> milli-seconds const multiplyingFactor = header === RetryAfterHeader ? 1000 : 1; return retryAfterValue * multiplyingFactor; // in milli-seconds } } // RetryAfterHeader ("Retry-After") has a special case where it might be formatted as a date instead of a number of seconds const retryAfterHeader = response.headers.get(RetryAfterHeader); if (!retryAfterHeader) return; const date = Date.parse(retryAfterHeader); const diff = date - Date.now(); // negative diff would mean a date in the past, so retry asap with 0 milliseconds return Number.isFinite(diff) ? Math.max(0, diff) : undefined; } catch (_a) { return undefined; } } /** * A response is a retry response if it has a throttling status code (429 or 503), * as long as one of the [ "Retry-After" or "retry-after-ms" or "x-ms-retry-after-ms" ] headers has a valid value. */ export function isThrottlingRetryResponse(response) { return Number.isFinite(getRetryAfterInMs(response)); } export function throttlingRetryStrategy() { return { name: "throttlingRetryStrategy", retry({ response }) { const retryAfterInMs = getRetryAfterInMs(response); if (!Number.isFinite(retryAfterInMs)) { return { skipStrategy: true }; } return { retryAfterInMs, }; }, }; } //# sourceMappingURL=throttlingRetryStrategy.js.map