-
Notifications
You must be signed in to change notification settings - Fork 29.8k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
esm: treat 307
and 308
as redirects in HTTPS imports
#43689
Changes from 3 commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,5 +1,6 @@ | ||
'use strict'; | ||
const { | ||
ArrayPrototypeIncludes, | ||
ObjectPrototypeHasOwnProperty, | ||
PromisePrototypeThen, | ||
SafeMap, | ||
|
@@ -89,6 +90,18 @@ function createUnzip() { | |
return createUnzip(); | ||
} | ||
|
||
/** | ||
* Redirection status code as per section 6.4 of RFC 7231: | ||
* https://datatracker.ietf.org/doc/html/rfc7231#section-6.4 | ||
* and RFC 7238: | ||
* https://datatracker.ietf.org/doc/html/rfc7238 | ||
* @param {number} statusCode | ||
* @returns {boolean} | ||
*/ | ||
function isRedirect(statusCode) { | ||
return ArrayPrototypeIncludes([300, 301, 302, 303, 307, 308], statusCode); | ||
} | ||
|
||
/** | ||
* @param {URL} parsed | ||
* @returns {Promise<CacheEntry> | CacheEntry} | ||
|
@@ -107,9 +120,8 @@ function fetchWithRedirects(parsed) { | |
// `finally` on network error/timeout. | ||
const { 0: res } = await once(req, 'response'); | ||
try { | ||
const isRedirect = res.statusCode >= 300 && res.statusCode <= 303; | ||
const hasLocation = ObjectPrototypeHasOwnProperty(res.headers, 'location'); | ||
if (isRedirect && hasLocation) { | ||
if (isRedirect(res.statusCode) && hasLocation) { | ||
const location = new URL(res.headers.location, parsed); | ||
if (location.protocol !== 'http:' && location.protocol !== 'https:') { | ||
throw new ERR_NETWORK_IMPORT_DISALLOWED( | ||
|
@@ -127,7 +139,7 @@ function fetchWithRedirects(parsed) { | |
err.message = `Cannot find module '${parsed.href}', HTTP 404`; | ||
throw err; | ||
} | ||
if (res.statusCode > 303 || res.statusCode < 200) { | ||
if (res.statusCode < 200 || res.statusCode >= 400) { | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Should this also include 304, as in Also what is this error There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I would just switch this to the new
We maintain a cache, and I think there are designs (perhaps only in people's heads at the moment?) for a write-to-disk cache in future (at which point a 304 would be very valid). I'd say account for it now whilst we're thinking of it (especially because it's trivial) rather than get bitten by it later.
This is when a remote module tries to access a local module (eg
Sorry, where are you seeing a There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Oh! Yes, indeed it should not throw disallowed network import for a 500. @aduh95 I see you just approved; I'm thinking this should be consider a blocker (it introduces a bug). The rest can be addressed in a follow-up. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Wrong error is not introduced in this PR, it's a part of original code. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Livia said it all, if there's a bug let's fix it in its own PR. This PR does a great job at adding support for 307 and 308, it wouldn't be fait to block it on a bug (or maybe not bug?) of the existing implementation. |
||
throw new ERR_NETWORK_IMPORT_DISALLOWED( | ||
res.headers.location, | ||
parsed.href, | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.