UNPKG

rekwest

Version:

The robust request library that humanity deserves 🌐

60 lines (59 loc) 2.45 kB
"use strict"; 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;