mirror of
https://github.com/servo/servo.git
synced 2025-08-03 20:50:07 +01:00
ISSUE-21263: implemented attribute setting in http loader
This commit is contained in:
parent
328244684a
commit
fdbec9835c
6 changed files with 49 additions and 22 deletions
|
@ -42,7 +42,7 @@ use net_traits::request::{RedirectMode, Referrer, Request, RequestMode};
|
|||
use net_traits::request::{ResponseTainting, ServiceWorkersMode};
|
||||
use net_traits::response::{HttpsState, Response, ResponseBody, ResponseType};
|
||||
use net_traits::{CookieSource, FetchMetadata, NetworkError, ReferrerPolicy};
|
||||
use net_traits::{RedirectStartValue, ResourceAttribute};
|
||||
use net_traits::{RedirectStartValue, ResourceAttribute, ResourceFetchTiming};
|
||||
use openssl::ssl::SslConnectorBuilder;
|
||||
use servo_url::{ImmutableOrigin, ServoUrl};
|
||||
use std::collections::{HashMap, HashSet};
|
||||
|
@ -51,8 +51,7 @@ use std::iter::FromIterator;
|
|||
use std::mem;
|
||||
use std::ops::Deref;
|
||||
use std::str::FromStr;
|
||||
use std::sync::Mutex;
|
||||
use std::sync::RwLock;
|
||||
use std::sync::{Arc, Mutex, RwLock};
|
||||
use std::time::{Duration, SystemTime};
|
||||
use time::{self, Tm};
|
||||
use tokio::prelude::{future, Future, Stream};
|
||||
|
@ -452,7 +451,6 @@ fn obtain_response(
|
|||
})
|
||||
.map_err(move |e| NetworkError::from_hyper_error(&e)),
|
||||
)
|
||||
// TODO(#21263) response_end (also needs to be set above if fetch is aborted due to an error)
|
||||
}
|
||||
|
||||
/// [HTTP fetch](https://fetch.spec.whatwg.org#http-fetch)
|
||||
|
@ -1146,6 +1144,27 @@ fn http_network_or_cache_fetch(
|
|||
response
|
||||
}
|
||||
|
||||
// Convenience struct that implements Done, for setting responseEnd on function return
|
||||
struct ResponseEndTimer(Option<Arc<Mutex<ResourceFetchTiming>>>);
|
||||
|
||||
impl ResponseEndTimer {
|
||||
fn neuter(&mut self) {
|
||||
self.0 = None;
|
||||
}
|
||||
}
|
||||
|
||||
impl Drop for ResponseEndTimer {
|
||||
fn drop(&mut self) {
|
||||
let ResponseEndTimer(resource_fetch_timing_opt) = self;
|
||||
|
||||
resource_fetch_timing_opt.as_ref().map_or((), |t| {
|
||||
t.lock()
|
||||
.unwrap()
|
||||
.set_attribute(ResourceAttribute::ResponseEnd);
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
/// [HTTP network fetch](https://fetch.spec.whatwg.org/#http-network-fetch)
|
||||
fn http_network_fetch(
|
||||
request: &Request,
|
||||
|
@ -1153,6 +1172,7 @@ fn http_network_fetch(
|
|||
done_chan: &mut DoneChannel,
|
||||
context: &FetchContext,
|
||||
) -> Response {
|
||||
let mut response_end_timer = ResponseEndTimer(Some(context.timing.clone()));
|
||||
// Step 1
|
||||
// nothing to do here, since credentials_flag is already a boolean
|
||||
|
||||
|
@ -1270,6 +1290,8 @@ fn http_network_fetch(
|
|||
|
||||
let done_sender2 = done_sender.clone();
|
||||
let done_sender3 = done_sender.clone();
|
||||
let timing_ptr2 = context.timing.clone();
|
||||
let timing_ptr3 = context.timing.clone();
|
||||
HANDLE.lock().unwrap().spawn(
|
||||
res.into_body()
|
||||
.map_err(|_| ())
|
||||
|
@ -1293,6 +1315,10 @@ fn http_network_fetch(
|
|||
_ => vec![],
|
||||
};
|
||||
*body = ResponseBody::Done(completed_body);
|
||||
timing_ptr2
|
||||
.lock()
|
||||
.unwrap()
|
||||
.set_attribute(ResourceAttribute::ResponseEnd);
|
||||
let _ = done_sender2.send(Data::Done);
|
||||
future::ok(())
|
||||
})
|
||||
|
@ -1303,6 +1329,10 @@ fn http_network_fetch(
|
|||
_ => vec![],
|
||||
};
|
||||
*body = ResponseBody::Done(completed_body);
|
||||
timing_ptr3
|
||||
.lock()
|
||||
.unwrap()
|
||||
.set_attribute(ResourceAttribute::ResponseEnd);
|
||||
let _ = done_sender3.send(Data::Done);
|
||||
}),
|
||||
);
|
||||
|
@ -1358,6 +1388,10 @@ fn http_network_fetch(
|
|||
// Substep 3
|
||||
|
||||
// Step 16
|
||||
|
||||
// Ensure we don't override "responseEnd" on successful return of this function
|
||||
response_end_timer.neuter();
|
||||
|
||||
response
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue