Skip to content
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

fetch: avoid async function in mainFetch to generate response #3605

Merged
merged 1 commit into from
Sep 19, 2024
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
84 changes: 39 additions & 45 deletions lib/web/fetch/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -573,53 +573,46 @@ async function mainFetch (fetchParams, recursive = false) {
// 11. If response is null, then set response to the result of running
// the steps corresponding to the first matching statement:
if (response === null) {
response = await (async () => {
const currentURL = requestCurrentURL(request)

if (
// - request’s current URL’s origin is same origin with request’s origin,
// and request’s response tainting is "basic"
(sameOrigin(currentURL, request.url) && request.responseTainting === 'basic') ||
// request’s current URL’s scheme is "data"
(currentURL.protocol === 'data:') ||
// - request’s mode is "navigate" or "websocket"
(request.mode === 'navigate' || request.mode === 'websocket')
) {
// 1. Set request’s response tainting to "basic".
request.responseTainting = 'basic'

// 2. Return the result of running scheme fetch given fetchParams.
return await schemeFetch(fetchParams)
}

// request’s mode is "same-origin"
if (request.mode === 'same-origin') {
// 1. Return a network error.
return makeNetworkError('request mode cannot be "same-origin"')
}

// request’s mode is "no-cors"
if (request.mode === 'no-cors') {
// 1. If request’s redirect mode is not "follow", then return a network
// error.
if (request.redirect !== 'follow') {
return makeNetworkError(
'redirect mode cannot be "follow" for "no-cors" request'
)
}

const currentURL = requestCurrentURL(request)
if (
// - request’s current URL’s origin is same origin with request’s origin,
// and request’s response tainting is "basic"
(sameOrigin(currentURL, request.url) && request.responseTainting === 'basic') ||
// request’s current URL’s scheme is "data"
(currentURL.protocol === 'data:') ||
// - request’s mode is "navigate" or "websocket"
(request.mode === 'navigate' || request.mode === 'websocket')
) {
// 1. Set request’s response tainting to "basic".
request.responseTainting = 'basic'

// 2. Return the result of running scheme fetch given fetchParams.
response = await schemeFetch(fetchParams)

// request’s mode is "same-origin"
} else if (request.mode === 'same-origin') {
// 1. Return a network error.
response = makeNetworkError('request mode cannot be "same-origin"')

// request’s mode is "no-cors"
} else if (request.mode === 'no-cors') {
// 1. If request’s redirect mode is not "follow", then return a network
// error.
if (request.redirect !== 'follow') {
response = makeNetworkError(
'redirect mode cannot be "follow" for "no-cors" request'
)
} else {
// 2. Set request’s response tainting to "opaque".
request.responseTainting = 'opaque'

// 3. Return the result of running scheme fetch given fetchParams.
return await schemeFetch(fetchParams)
}

// request’s current URL’s scheme is not an HTTP(S) scheme
if (!urlIsHttpHttpsScheme(requestCurrentURL(request))) {
// Return a network error.
return makeNetworkError('URL scheme must be a HTTP(S) scheme')
response = await schemeFetch(fetchParams)
}
// request’s current URL’s scheme is not an HTTP(S) scheme
} else if (!urlIsHttpHttpsScheme(requestCurrentURL(request))) {
// Return a network error.
response = makeNetworkError('URL scheme must be a HTTP(S) scheme')

// - request’s use-CORS-preflight flag is set
// - request’s unsafe-request flag is set and either request’s method is
Expand All @@ -633,13 +626,14 @@ async function mainFetch (fetchParams, recursive = false) {
// 4. Return corsWithPreflightResponse.
// TODO

// Otherwise
// Otherwise
} else {
// 1. Set request’s response tainting to "cors".
request.responseTainting = 'cors'

// 2. Return the result of running HTTP fetch given fetchParams.
return await httpFetch(fetchParams)
})()
response = await httpFetch(fetchParams)
}
}

// 12. If recursive is true, then return response.
Expand Down
Loading