mirror of
https://github.com/servo/servo.git
synced 2025-08-03 04:30:10 +01:00
net: Make most of the resource task messages serializable.
This commit is contained in:
parent
7e77285745
commit
9c9d7dc93b
15 changed files with 373 additions and 105 deletions
|
@ -2,7 +2,9 @@
|
|||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||
|
||||
use net_traits::{ControlMsg, CookieSource, LoadData, Metadata, LoadConsumer};
|
||||
use net_traits::{ControlMsg, CookieSource, LoadData, Metadata, LoadConsumer, SerializableMethod};
|
||||
use net_traits::{SerializableHeaders, SerializableRawStatus, SerializableStringResult};
|
||||
use net_traits::{SerializableUrl};
|
||||
use net_traits::ProgressMsg::{Payload, Done};
|
||||
use devtools_traits::{ChromeToDevtoolsControlMsg, DevtoolsControlMsg, NetworkEvent};
|
||||
use mime_classifier::MIMEClassifier;
|
||||
|
@ -51,7 +53,7 @@ fn send_error(url: Url, err: String, start_chan: LoadConsumer) {
|
|||
metadata.status = None;
|
||||
|
||||
match start_sending_opt(start_chan, metadata) {
|
||||
Ok(p) => p.send(Done(Err(err))).unwrap(),
|
||||
Ok(p) => p.send(Done(SerializableStringResult(Err(err)))).unwrap(),
|
||||
_ => {}
|
||||
};
|
||||
}
|
||||
|
@ -94,7 +96,7 @@ fn load(mut load_data: LoadData,
|
|||
// repository DOES exist, please update this constant to use it.
|
||||
let max_redirects = 50;
|
||||
let mut iters = 0;
|
||||
let mut url = load_data.url.clone();
|
||||
let mut url = load_data.url.0.clone();
|
||||
let mut redirected_to = HashSet::new();
|
||||
|
||||
// If the URL is a view-source scheme then the scheme data contains the
|
||||
|
@ -153,7 +155,10 @@ reason: \"certificate verify failed\" }]))";
|
|||
Request::with_connector(load_data.method.clone(), url.clone(),
|
||||
&HttpsConnector::new(Openssl { context: Arc::new(context) }))
|
||||
};
|
||||
let mut req = match req {
|
||||
|
||||
let mut req = match Request::with_connector(load_data.method.0.clone(),
|
||||
url.clone(),
|
||||
&mut connector) {
|
||||
Ok(req) => req,
|
||||
Err(HttpError::Io(ref io_error)) if (
|
||||
io_error.kind() == io::ErrorKind::Other &&
|
||||
|
@ -182,11 +187,11 @@ reason: \"certificate verify failed\" }]))";
|
|||
// https://bugzilla.mozilla.org/show_bug.cgi?id=216828 .
|
||||
// Only preserve ones which have been explicitly marked as such.
|
||||
if iters == 1 {
|
||||
let mut combined_headers = load_data.headers.clone();
|
||||
let mut combined_headers = (*load_data.headers).clone();
|
||||
combined_headers.extend(load_data.preserved_headers.iter());
|
||||
*req.headers_mut() = combined_headers;
|
||||
} else {
|
||||
*req.headers_mut() = load_data.preserved_headers.clone();
|
||||
*req.headers_mut() = (*load_data.preserved_headers).clone();
|
||||
}
|
||||
|
||||
req.headers_mut().set(host);
|
||||
|
@ -202,7 +207,9 @@ reason: \"certificate verify failed\" }]))";
|
|||
}
|
||||
|
||||
let (tx, rx) = channel();
|
||||
cookies_chan.send(ControlMsg::GetCookiesForUrl(url.clone(), tx, CookieSource::HTTP)).unwrap();
|
||||
cookies_chan.send(ControlMsg::GetCookiesForUrl(SerializableUrl(url.clone()),
|
||||
tx,
|
||||
CookieSource::HTTP)).unwrap();
|
||||
if let Some(cookie_list) = rx.recv().unwrap() {
|
||||
let mut v = Vec::new();
|
||||
v.push(cookie_list.into_bytes());
|
||||
|
@ -213,7 +220,7 @@ reason: \"certificate verify failed\" }]))";
|
|||
req.headers_mut().set_raw("Accept-Encoding".to_owned(), vec![b"gzip, deflate".to_vec()]);
|
||||
}
|
||||
if log_enabled!(log::LogLevel::Info) {
|
||||
info!("{}", load_data.method);
|
||||
info!("{}", load_data.method.0);
|
||||
for header in req.headers().iter() {
|
||||
info!(" - {}", header);
|
||||
}
|
||||
|
@ -241,7 +248,7 @@ reason: \"certificate verify failed\" }]))";
|
|||
writer
|
||||
},
|
||||
_ => {
|
||||
match load_data.method {
|
||||
match *load_data.method {
|
||||
Method::Get | Method::Head => (),
|
||||
_ => req.headers_mut().set(ContentLength(0))
|
||||
}
|
||||
|
@ -259,9 +266,9 @@ reason: \"certificate verify failed\" }]))";
|
|||
// TODO: Do this only if load_data has some pipeline_id, and send the pipeline_id in the message
|
||||
let request_id = uuid::Uuid::new_v4().to_simple_string();
|
||||
if let Some(ref chan) = devtools_chan {
|
||||
let net_event = NetworkEvent::HttpRequest(load_data.url.clone(),
|
||||
load_data.method.clone(),
|
||||
load_data.headers.clone(),
|
||||
let net_event = NetworkEvent::HttpRequest((*load_data.url).clone(),
|
||||
(*load_data.method).clone(),
|
||||
(*load_data.headers).clone(),
|
||||
load_data.data.clone());
|
||||
chan.send(DevtoolsControlMsg::FromChrome(
|
||||
ChromeToDevtoolsControlMsg::NetworkEventMessage(request_id.clone(),
|
||||
|
@ -287,7 +294,7 @@ reason: \"certificate verify failed\" }]))";
|
|||
if let Some(cookies) = response.headers.get_raw("set-cookie") {
|
||||
for cookie in cookies.iter() {
|
||||
if let Ok(cookies) = String::from_utf8(cookie.clone()) {
|
||||
cookies_chan.send(ControlMsg::SetCookiesForUrl(url.clone(),
|
||||
cookies_chan.send(ControlMsg::SetCookiesForUrl(SerializableUrl(url.clone()),
|
||||
cookies,
|
||||
CookieSource::HTTP)).unwrap();
|
||||
}
|
||||
|
@ -325,10 +332,10 @@ reason: \"certificate verify failed\" }]))";
|
|||
|
||||
// According to https://tools.ietf.org/html/rfc7231#section-6.4.2,
|
||||
// historically UAs have rewritten POST->GET on 301 and 302 responses.
|
||||
if load_data.method == Method::Post &&
|
||||
if *load_data.method == Method::Post &&
|
||||
(response.status == StatusCode::MovedPermanently ||
|
||||
response.status == StatusCode::Found) {
|
||||
load_data.method = Method::Get;
|
||||
load_data.method = SerializableMethod(Method::Get);
|
||||
}
|
||||
|
||||
if redirected_to.contains(&url) {
|
||||
|
@ -352,8 +359,8 @@ reason: \"certificate verify failed\" }]))";
|
|||
Some(&ContentType(ref mime)) => Some(mime),
|
||||
None => None
|
||||
});
|
||||
metadata.headers = Some(adjusted_headers);
|
||||
metadata.status = Some(response.status_raw().clone());
|
||||
metadata.headers = Some(SerializableHeaders(adjusted_headers));
|
||||
metadata.status = Some(SerializableRawStatus(response.status_raw().clone()));
|
||||
|
||||
let mut encoding_str: Option<String> = None;
|
||||
//FIXME: Implement Content-Encoding Header https://github.com/hyperium/hyper/issues/391
|
||||
|
@ -389,7 +396,7 @@ reason: \"certificate verify failed\" }]))";
|
|||
send_data(&mut response_decoding, start_chan, metadata, classifier);
|
||||
}
|
||||
Err(err) => {
|
||||
send_error(metadata.final_url, err.to_string(), start_chan);
|
||||
send_error((*metadata.final_url).clone(), err.to_string(), start_chan);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
@ -438,5 +445,5 @@ fn send_data<R: Read>(reader: &mut R,
|
|||
};
|
||||
}
|
||||
|
||||
let _ = progress_chan.send(Done(Ok(())));
|
||||
let _ = progress_chan.send(Done(SerializableStringResult(Ok(()))));
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue