mirror of
https://github.com/servo/servo.git
synced 2025-07-22 23:03:42 +01:00
Bring http_network_or_cache_fetch
closer to the spec (#33531)
* Document "fetch" method Signed-off-by: Simon Wülker <simon.wuelker@arcor.de> * Bring http_network_or_cache_fetch closer to the spec Signed-off-by: Simon Wülker <simon.wuelker@arcor.de> * fix test-tidy errors Signed-off-by: Simon Wülker <simon.wuelker@arcor.de> * Move all code into http_loader.rs Signed-off-by: Simon Wülker <simon.wuelker@arcor.de> * Don't panic if hyper/servo disagree about valid origins Signed-off-by: Simon Wülker <simon.wuelker@arcor.de> * Add "otherwise" to spec comment Signed-off-by: Simon Wülker <simon.wuelker@arcor.de> * Convert FIXME's to TODOs when appropriate Signed-off-by: Simon Wülker <simon.wuelker@arcor.de> * Remove TODO about No-Store cache directive Signed-off-by: Simon Wülker <simon.wuelker@arcor.de> * Remove indentation from multiline spec comments Signed-off-by: Simon Wülker <simon.wuelker@arcor.de> * Add fetch assertions This is from a spec update where assertions about requests origin not being client were added. Signed-off-by: Simon Wülker <simon.wuelker@arcor.de> * Add note about serializing headers Signed-off-by: Simon Wülker <simon.wuelker@arcor.de> * Add TODO about partitioning http cache Signed-off-by: Simon Wülker <simon.wuelker@arcor.de> * Convert FIXME to TODO in script/ Signed-off-by: Simon Wülker <simon.wuelker@arcor.de> * Link to relevant issue for TODO comments Signed-off-by: Simon Wülker <simon.wuelker@arcor.de> --------- Signed-off-by: Simon Wülker <simon.wuelker@arcor.de>
This commit is contained in:
parent
fc0d4d8157
commit
457d8a8a5c
3 changed files with 320 additions and 188 deletions
|
@ -138,7 +138,7 @@ fn request_init_from_request(request: NetTraitsRequest) -> RequestBuilder {
|
|||
}
|
||||
}
|
||||
|
||||
// https://fetch.spec.whatwg.org/#fetch-method
|
||||
/// <https://fetch.spec.whatwg.org/#fetch-method>
|
||||
#[allow(crown::unrooted_must_root, non_snake_case)]
|
||||
pub fn Fetch(
|
||||
global: &GlobalScope,
|
||||
|
@ -148,33 +148,47 @@ pub fn Fetch(
|
|||
) -> Rc<Promise> {
|
||||
let core_resource_thread = global.core_resource_thread();
|
||||
|
||||
// Step 1
|
||||
// Step 1. Let p be a new promise.
|
||||
let promise = Promise::new_in_current_realm(comp);
|
||||
let response = Response::new(global);
|
||||
|
||||
// Step 2
|
||||
// Step 7. Let responseObject be null.
|
||||
// NOTE: We do initialize the object earlier earlier so we can use it to track errors
|
||||
let response = Response::new(global);
|
||||
response.Headers().set_guard(Guard::Immutable);
|
||||
|
||||
// Step 2. Let requestObject be the result of invoking the initial value of Request as constructor
|
||||
// with input and init as arguments. If this throws an exception, reject p with it and return p.
|
||||
let request = match Request::Constructor(global, None, CanGc::note(), input, init) {
|
||||
Err(e) => {
|
||||
response.error_stream(e.clone());
|
||||
promise.reject_error(e);
|
||||
return promise;
|
||||
},
|
||||
Ok(r) => r.get_request(),
|
||||
Ok(r) => {
|
||||
// Step 3. Let request be requestObject’s request.
|
||||
r.get_request()
|
||||
},
|
||||
};
|
||||
let timing_type = request.timing_type();
|
||||
|
||||
let mut request_init = request_init_from_request(request);
|
||||
request_init.csp_list.clone_from(&global.get_csp_list());
|
||||
|
||||
// Step 3
|
||||
// TODO: Step 4. If requestObject’s signal is aborted, then: [..]
|
||||
|
||||
// Step 5. Let globalObject be request’s client’s global object.
|
||||
// NOTE: We already get the global object as an argument
|
||||
|
||||
// Step 6. If globalObject is a ServiceWorkerGlobalScope object, then set request’s
|
||||
// service-workers mode to "none".
|
||||
if global.downcast::<ServiceWorkerGlobalScope>().is_some() {
|
||||
request_init.service_workers_mode = ServiceWorkersMode::None;
|
||||
}
|
||||
|
||||
// Step 4
|
||||
response.Headers().set_guard(Guard::Immutable);
|
||||
// TODO: Steps 8-11, abortcontroller stuff
|
||||
|
||||
// Step 5
|
||||
// Step 12. Set controller to the result of calling fetch given request and
|
||||
// processResponse given response being these steps: [..]
|
||||
let (action_sender, action_receiver) = ipc::channel().unwrap();
|
||||
let fetch_context = Arc::new(Mutex::new(FetchContext {
|
||||
fetch_promise: Some(TrustedPromise::new(promise.clone())),
|
||||
|
@ -200,6 +214,7 @@ pub fn Fetch(
|
|||
))
|
||||
.unwrap();
|
||||
|
||||
// Step 13. Return p.
|
||||
promise
|
||||
}
|
||||
|
||||
|
@ -263,6 +278,7 @@ impl FetchResponseListener for FetchContext {
|
|||
},
|
||||
},
|
||||
}
|
||||
|
||||
// Step 4.3
|
||||
promise.resolve_native(&self.response_object.root());
|
||||
self.fetch_promise = Some(TrustedPromise::new(promise));
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue