rekwest
Version:
The robust request library that humanity deserves 🌐
60 lines (59 loc) • 2.45 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.redirects = void 0;
var _nodeHttp = _interopRequireDefault(require("node:http2"));
var _nodeStream = require("node:stream");
var _constants = require("./constants.cjs");
var _errors = require("./errors.cjs");
var _index = _interopRequireDefault(require("./index.cjs"));
var _utils = require("./utils.cjs");
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
const {
HTTP2_HEADER_LOCATION,
HTTP2_METHOD_GET,
HTTP2_METHOD_HEAD,
HTTP2_METHOD_POST,
HTTP_STATUS_FOUND,
HTTP_STATUS_MOVED_PERMANENTLY,
HTTP_STATUS_PERMANENT_REDIRECT,
HTTP_STATUS_SEE_OTHER,
HTTP_STATUS_TEMPORARY_REDIRECT
} = _nodeHttp.default.constants;
const redirects = (res, options) => {
const {
credentials,
follow,
redirect,
url
} = options;
if (follow && /3\d{2}/.test(res.statusCode) && res.headers[HTTP2_HEADER_LOCATION]) {
if (redirect === _constants.requestRedirect.error) {
return res.emit('error', new _errors.RequestError(`Unexpected redirect, redirect mode is set to '${redirect}'.`));
}
if (redirect === _constants.requestRedirect.follow) {
const location = new URL(res.headers[HTTP2_HEADER_LOCATION], url);
if (!/^https?:/i.test(location.protocol)) {
return res.emit('error', new _errors.RequestError('URL scheme must be "http" or "https".'));
}
if (!(0, _utils.sameOrigin)(location, url)) {
if (credentials !== _constants.requestCredentials.include) {
options.credentials = _constants.requestCredentials.omit;
}
options.h2 = false;
}
if ([HTTP_STATUS_PERMANENT_REDIRECT, HTTP_STATUS_TEMPORARY_REDIRECT].includes(res.statusCode) && (0, _utils.isPipeStream)(options.body) && !(0, _nodeStream.isReadable)(options.body)) {
return res.emit('error', new _errors.RequestError(`Unable to ${redirect} redirect with streamable body.`));
}
if ([HTTP_STATUS_MOVED_PERMANENTLY, HTTP_STATUS_FOUND].includes(res.statusCode) && options.method === HTTP2_METHOD_POST || res.statusCode === HTTP_STATUS_SEE_OTHER && ![HTTP2_METHOD_GET, HTTP2_METHOD_HEAD].includes(options.method)) {
options.body = null;
options.method = HTTP2_METHOD_GET;
}
options.follow--;
options.redirected = true;
return (0, _index.default)(location, options);
}
}
};
exports.redirects = redirects;