| | |
| | | }); |
| | | |
| | | const INTERNALS$2 = Symbol('Request internals'); |
| | | const URL = whatwgUrl.URL; |
| | | const URL = Url.URL || whatwgUrl.URL; |
| | | |
| | | // fix an issue where "format", "parse" aren't a named export for node <10 |
| | | const parse_url = Url.parse; |
| | |
| | | AbortError.prototype.constructor = AbortError; |
| | | AbortError.prototype.name = 'AbortError'; |
| | | |
| | | const URL$1 = Url.URL || whatwgUrl.URL; |
| | | |
| | | // fix an issue where "PassThrough", "resolve" aren't a named export for node <10 |
| | | const PassThrough$1 = Stream.PassThrough; |
| | | const resolve_url = Url.resolve; |
| | | |
| | | const isDomainOrSubdomain = function isDomainOrSubdomain(destination, original) { |
| | | const orig = new URL$1(original).hostname; |
| | | const dest = new URL$1(destination).hostname; |
| | | |
| | | return orig === dest || orig[orig.length - dest.length - 1] === '.' && orig.endsWith(dest); |
| | | }; |
| | | |
| | | /** |
| | | * Fetch function |
| | |
| | | const location = headers.get('Location'); |
| | | |
| | | // HTTP fetch step 5.3 |
| | | const locationURL = location === null ? null : resolve_url(request.url, location); |
| | | let locationURL = null; |
| | | try { |
| | | locationURL = location === null ? null : new URL$1(location, request.url).toString(); |
| | | } catch (err) { |
| | | // error here can only be invalid URL in Location: header |
| | | // do not throw when options.redirect == manual |
| | | // let the user extract the errorneous redirect URL |
| | | if (request.redirect !== 'manual') { |
| | | reject(new FetchError(`uri requested responds with an invalid redirect URL: ${location}`, 'invalid-redirect')); |
| | | finalize(); |
| | | return; |
| | | } |
| | | } |
| | | |
| | | // HTTP fetch step 5.5 |
| | | switch (request.redirect) { |
| | |
| | | size: request.size |
| | | }; |
| | | |
| | | if (!isDomainOrSubdomain(request.url, locationURL)) { |
| | | for (const name of ['authorization', 'www-authenticate', 'cookie', 'cookie2']) { |
| | | requestOpts.headers.delete(name); |
| | | } |
| | | } |
| | | |
| | | // HTTP-redirect fetch step 9 |
| | | if (res.statusCode !== 303 && request.body && getTotalBytes(request) === null) { |
| | | reject(new FetchError('Cannot follow redirect with body being a readable stream', 'unsupported-redirect')); |