mirror of
https://github.com/servo/servo.git
synced 2025-08-05 21:50:18 +01:00
Update implementations of HTTP-network fetch
and HTTP-network-or-cache fetch
to take fetchParams
as an argument (#35205)
* change http-network-or-cache-fetch to take FetchParams argument instead of request Signed-off-by: Lloyd Massiah <artmis9@protonmail.com> * change http-network-fetch to take fetchParams as an argument Signed-off-by: Lloyd Massiah <artmis9@protonmail.com> * run formatter Signed-off-by: Lloyd Massiah <artmis9@protonmail.com> * renaming variable to be similar to step in spec Signed-off-by: Lloyd Massiah <artmis9@protonmail.com> * refixing usage of http_request after rebasing Signed-off-by: Lloyd Massiah <artmis9@protonmail.com> --------- Signed-off-by: Lloyd Massiah <artmis9@protonmail.com>
This commit is contained in:
parent
fdfaf7b15c
commit
24ead9c3a9
1 changed files with 38 additions and 26 deletions
|
@ -791,7 +791,7 @@ pub async fn http_fetch(
|
||||||
.set_attribute(ResourceAttribute::RequestStart);
|
.set_attribute(ResourceAttribute::RequestStart);
|
||||||
|
|
||||||
let mut fetch_result = http_network_or_cache_fetch(
|
let mut fetch_result = http_network_or_cache_fetch(
|
||||||
request,
|
fetch_params,
|
||||||
authentication_fetch_flag,
|
authentication_fetch_flag,
|
||||||
cors_flag,
|
cors_flag,
|
||||||
done_chan,
|
done_chan,
|
||||||
|
@ -800,7 +800,7 @@ pub async fn http_fetch(
|
||||||
.await;
|
.await;
|
||||||
|
|
||||||
// Substep 4
|
// Substep 4
|
||||||
if cors_flag && cors_check(request, &fetch_result).is_err() {
|
if cors_flag && cors_check(&fetch_params.request, &fetch_result).is_err() {
|
||||||
return Response::network_error(NetworkError::Internal("CORS check failed".into()));
|
return Response::network_error(NetworkError::Internal("CORS check failed".into()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -808,6 +808,8 @@ pub async fn http_fetch(
|
||||||
response = Some(fetch_result);
|
response = Some(fetch_result);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let request = &mut fetch_params.request;
|
||||||
|
|
||||||
// response is guaranteed to be something by now
|
// response is guaranteed to be something by now
|
||||||
let mut response = response.unwrap();
|
let mut response = response.unwrap();
|
||||||
|
|
||||||
|
@ -1100,17 +1102,20 @@ pub async fn http_redirect_fetch(
|
||||||
/// [HTTP network or cache fetch](https://fetch.spec.whatwg.org#http-network-or-cache-fetch)
|
/// [HTTP network or cache fetch](https://fetch.spec.whatwg.org#http-network-or-cache-fetch)
|
||||||
#[async_recursion]
|
#[async_recursion]
|
||||||
async fn http_network_or_cache_fetch(
|
async fn http_network_or_cache_fetch(
|
||||||
request: &mut Request,
|
fetch_params: &mut FetchParams,
|
||||||
authentication_fetch_flag: bool,
|
authentication_fetch_flag: bool,
|
||||||
cors_flag: bool,
|
cors_flag: bool,
|
||||||
done_chan: &mut DoneChannel,
|
done_chan: &mut DoneChannel,
|
||||||
context: &FetchContext,
|
context: &FetchContext,
|
||||||
) -> Response {
|
) -> Response {
|
||||||
// Step 1. Let request be fetchParams’s request.
|
// Step 1. Let request be fetchParams’s request.
|
||||||
// NOTE: We get request as an argument (Fetchparams are not implemented, see #33616)
|
let request = &mut fetch_params.request;
|
||||||
|
|
||||||
// Step 3. Let httpRequest be null.
|
// Step 2. Let httpFetchParams be null.
|
||||||
let mut http_request;
|
let http_fetch_params: &mut FetchParams;
|
||||||
|
let mut fetch_params_copy: FetchParams;
|
||||||
|
|
||||||
|
// Step 3. Let httpRequest be null. (See step 8 for initialization)
|
||||||
|
|
||||||
// Step 4. Let response be null.
|
// Step 4. Let response be null.
|
||||||
let mut response: Option<Response> = None;
|
let mut response: Option<Response> = None;
|
||||||
|
@ -1124,15 +1129,17 @@ async fn http_network_or_cache_fetch(
|
||||||
let request_has_no_window = request.window == RequestWindow::NoWindow;
|
let request_has_no_window = request.window == RequestWindow::NoWindow;
|
||||||
|
|
||||||
let http_request = if request_has_no_window && request.redirect_mode == RedirectMode::Error {
|
let http_request = if request_has_no_window && request.redirect_mode == RedirectMode::Error {
|
||||||
request
|
http_fetch_params = fetch_params;
|
||||||
|
&mut http_fetch_params.request
|
||||||
}
|
}
|
||||||
// Step 8.2 Otherwise:
|
// Step 8.2 Otherwise:
|
||||||
else {
|
else {
|
||||||
// Step 8.2.1: Set httpRequest to a clone of request.
|
// Step 8.2.1 - 8.2.3: Set httpRequest to a clone of request
|
||||||
http_request = request.clone();
|
// and Set httpFetchParams to a copy of fetchParams.
|
||||||
|
fetch_params_copy = fetch_params.clone();
|
||||||
|
http_fetch_params = &mut fetch_params_copy;
|
||||||
|
|
||||||
// TODO(#33616): Step 8.2.2-8.2.3
|
&mut http_fetch_params.request
|
||||||
&mut http_request
|
|
||||||
};
|
};
|
||||||
|
|
||||||
// Step 8.3: Let includeCredentials be true if one of:
|
// Step 8.3: Let includeCredentials be true if one of:
|
||||||
|
@ -1509,8 +1516,9 @@ async fn http_network_or_cache_fetch(
|
||||||
// Step 10.2 Let forwardResponse be the result of running HTTP-network fetch given httpFetchParams,
|
// Step 10.2 Let forwardResponse be the result of running HTTP-network fetch given httpFetchParams,
|
||||||
// includeCredentials, and isNewConnectionFetch.
|
// includeCredentials, and isNewConnectionFetch.
|
||||||
let forward_response =
|
let forward_response =
|
||||||
http_network_fetch(http_request, include_credentials, done_chan, context).await;
|
http_network_fetch(http_fetch_params, include_credentials, done_chan, context).await;
|
||||||
|
|
||||||
|
let http_request = &mut http_fetch_params.request;
|
||||||
// Step 10.3 If httpRequest’s method is unsafe and forwardResponse’s status is in the range 200 to 399,
|
// Step 10.3 If httpRequest’s method is unsafe and forwardResponse’s status is in the range 200 to 399,
|
||||||
// inclusive, invalidate appropriate stored responses in httpCache, as per the
|
// inclusive, invalidate appropriate stored responses in httpCache, as per the
|
||||||
// "Invalidating Stored Responses" chapter of HTTP Caching, and set storedResponse to null.
|
// "Invalidating Stored Responses" chapter of HTTP Caching, and set storedResponse to null.
|
||||||
|
@ -1547,6 +1555,8 @@ async fn http_network_or_cache_fetch(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let http_request = &mut http_fetch_params.request;
|
||||||
// The cache has been updated, set its state to ready to construct.
|
// The cache has been updated, set its state to ready to construct.
|
||||||
update_http_cache_state(context, http_request);
|
update_http_cache_state(context, http_request);
|
||||||
|
|
||||||
|
@ -1576,14 +1586,16 @@ async fn http_network_or_cache_fetch(
|
||||||
{
|
{
|
||||||
// TODO: Step 14.1 Spec says requires testing on multiple WWW-Authenticate headers
|
// TODO: Step 14.1 Spec says requires testing on multiple WWW-Authenticate headers
|
||||||
|
|
||||||
|
let request = &mut fetch_params.request;
|
||||||
|
|
||||||
// Step 14.2 If request’s body is non-null, then:
|
// Step 14.2 If request’s body is non-null, then:
|
||||||
if http_request.body.is_some() {
|
if request.body.is_some() {
|
||||||
// TODO Implement body source
|
// TODO Implement body source
|
||||||
}
|
}
|
||||||
|
|
||||||
// Step 14.3 If request’s use-URL-credentials flag is unset or isAuthenticationFetch is true, then:
|
// Step 14.3 If request’s use-URL-credentials flag is unset or isAuthenticationFetch is true, then:
|
||||||
if !http_request.use_url_credentials || authentication_fetch_flag {
|
if !request.use_url_credentials || authentication_fetch_flag {
|
||||||
let Some(webview_id) = http_request.target_webview_id else {
|
let Some(webview_id) = request.target_webview_id else {
|
||||||
return response;
|
return response;
|
||||||
};
|
};
|
||||||
let Some(credentials) =
|
let Some(credentials) =
|
||||||
|
@ -1598,12 +1610,12 @@ async fn http_network_or_cache_fetch(
|
||||||
return response;
|
return response;
|
||||||
};
|
};
|
||||||
|
|
||||||
if let Err(err) = http_request.current_url_mut().set_username(&username) {
|
if let Err(err) = request.current_url_mut().set_username(&username) {
|
||||||
error!("error setting username for url: {:?}", err);
|
error!("error setting username for url: {:?}", err);
|
||||||
return response;
|
return response;
|
||||||
};
|
};
|
||||||
|
|
||||||
if let Err(err) = http_request.current_url_mut().set_password(Some(&password)) {
|
if let Err(err) = request.current_url_mut().set_password(Some(&password)) {
|
||||||
error!("error setting password for url: {:?}", err);
|
error!("error setting password for url: {:?}", err);
|
||||||
return response;
|
return response;
|
||||||
};
|
};
|
||||||
|
@ -1615,7 +1627,7 @@ async fn http_network_or_cache_fetch(
|
||||||
|
|
||||||
// Step 14.4 Set response to the result of running HTTP-network-or-cache fetch given fetchParams and true.
|
// Step 14.4 Set response to the result of running HTTP-network-or-cache fetch given fetchParams and true.
|
||||||
response = http_network_or_cache_fetch(
|
response = http_network_or_cache_fetch(
|
||||||
http_request,
|
fetch_params,
|
||||||
true, /* authentication flag */
|
true, /* authentication flag */
|
||||||
cors_flag,
|
cors_flag,
|
||||||
done_chan,
|
done_chan,
|
||||||
|
@ -1626,6 +1638,7 @@ async fn http_network_or_cache_fetch(
|
||||||
|
|
||||||
// Step 15. If response’s status is 407, then:
|
// Step 15. If response’s status is 407, then:
|
||||||
if response.status == StatusCode::PROXY_AUTHENTICATION_REQUIRED {
|
if response.status == StatusCode::PROXY_AUTHENTICATION_REQUIRED {
|
||||||
|
let request = &mut fetch_params.request;
|
||||||
// Step 15.1 If request’s window is "no-window", then return a network error.
|
// Step 15.1 If request’s window is "no-window", then return a network error.
|
||||||
|
|
||||||
if request_has_no_window {
|
if request_has_no_window {
|
||||||
|
@ -1641,7 +1654,7 @@ async fn http_network_or_cache_fetch(
|
||||||
|
|
||||||
// Step 15.4 Prompt the end user as appropriate in request’s window
|
// Step 15.4 Prompt the end user as appropriate in request’s window
|
||||||
// window and store the result as a proxy-authentication entry.
|
// window and store the result as a proxy-authentication entry.
|
||||||
let Some(webview_id) = http_request.target_webview_id else {
|
let Some(webview_id) = request.target_webview_id else {
|
||||||
return response;
|
return response;
|
||||||
};
|
};
|
||||||
let Some(credentials) =
|
let Some(credentials) =
|
||||||
|
@ -1663,7 +1676,7 @@ async fn http_network_or_cache_fetch(
|
||||||
};
|
};
|
||||||
{
|
{
|
||||||
let mut auth_cache = context.state.auth_cache.write().unwrap();
|
let mut auth_cache = context.state.auth_cache.write().unwrap();
|
||||||
let key = http_request.current_url().origin().ascii_serialization();
|
let key = request.current_url().origin().ascii_serialization();
|
||||||
auth_cache.entries.insert(key, entry);
|
auth_cache.entries.insert(key, entry);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1673,7 +1686,7 @@ async fn http_network_or_cache_fetch(
|
||||||
|
|
||||||
// Step 15.5 Set response to the result of running HTTP-network-or-cache fetch given fetchParams.
|
// Step 15.5 Set response to the result of running HTTP-network-or-cache fetch given fetchParams.
|
||||||
response = http_network_or_cache_fetch(
|
response = http_network_or_cache_fetch(
|
||||||
http_request,
|
fetch_params,
|
||||||
false, /* authentication flag */
|
false, /* authentication flag */
|
||||||
cors_flag,
|
cors_flag,
|
||||||
done_chan,
|
done_chan,
|
||||||
|
@ -1805,15 +1818,15 @@ fn prompt_user_for_credentials(
|
||||||
|
|
||||||
/// [HTTP network fetch](https://fetch.spec.whatwg.org/#http-network-fetch)
|
/// [HTTP network fetch](https://fetch.spec.whatwg.org/#http-network-fetch)
|
||||||
async fn http_network_fetch(
|
async fn http_network_fetch(
|
||||||
request: &mut Request,
|
fetch_params: &mut FetchParams,
|
||||||
credentials_flag: bool,
|
credentials_flag: bool,
|
||||||
done_chan: &mut DoneChannel,
|
done_chan: &mut DoneChannel,
|
||||||
context: &FetchContext,
|
context: &FetchContext,
|
||||||
) -> Response {
|
) -> Response {
|
||||||
let mut response_end_timer = ResponseEndTimer(Some(context.timing.clone()));
|
let mut response_end_timer = ResponseEndTimer(Some(context.timing.clone()));
|
||||||
|
|
||||||
// Step 1
|
// Step 1: Let request be fetchParams’s request.
|
||||||
// nothing to do here, since credentials_flag is already a boolean
|
let request = &mut fetch_params.request;
|
||||||
|
|
||||||
// Step 2
|
// Step 2
|
||||||
// TODO be able to create connection using current url's origin and credentials
|
// TODO be able to create connection using current url's origin and credentials
|
||||||
|
@ -2147,8 +2160,7 @@ async fn cors_preflight_fetch(
|
||||||
// Step 6
|
// Step 6
|
||||||
let mut fetch_params = FetchParams::new(preflight);
|
let mut fetch_params = FetchParams::new(preflight);
|
||||||
let response =
|
let response =
|
||||||
http_network_or_cache_fetch(&mut fetch_params.request, false, false, &mut None, context)
|
http_network_or_cache_fetch(&mut fetch_params, false, false, &mut None, context).await;
|
||||||
.await;
|
|
||||||
// Step 7
|
// Step 7
|
||||||
if cors_check(request, &response).is_ok() && response.status.code().is_success() {
|
if cors_check(request, &response).is_ok() && response.status.code().is_success() {
|
||||||
// Substep 1
|
// Substep 1
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue