@azure/core-rest-pipeline
Version:
Isomorphic client library for making HTTP requests in node.js and browser.
74 lines • 3.1 kB
JavaScript
// 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