Check in for task 1,4 and 5

Adding pipelineID to httpresponse message, clearner code for task1

Commit for Refactored task

Unit tests

Removing extra whitespaces.

Removing extra whitespaces.

Removing tabs whitespaces

Making Code tidier.

Style issues Fix

Test-tidy Fixes
This commit is contained in:
Abhishek Kumar 2015-10-21 18:28:14 -04:00
parent 0d15101323
commit b7de946205
13 changed files with 96 additions and 34 deletions

View file

@ -264,6 +264,7 @@ pub struct HttpRequest {
pub method: Method, pub method: Method,
pub headers: Headers, pub headers: Headers,
pub body: Option<Vec<u8>>, pub body: Option<Vec<u8>>,
pub pipeline_id: PipelineId,
} }
#[derive(Debug, PartialEq)] #[derive(Debug, PartialEq)]
@ -271,6 +272,7 @@ pub struct HttpResponse {
pub headers: Option<Headers>, pub headers: Option<Headers>,
pub status: Option<RawStatus>, pub status: Option<RawStatus>,
pub body: Option<Vec<u8>>, pub body: Option<Vec<u8>>,
pub pipeline_id: PipelineId,
} }
pub enum NetworkEvent { pub enum NetworkEvent {

View file

@ -26,6 +26,9 @@ path = "../plugins"
version = "0.6" version = "0.6"
features = [ "serde-serialization" ] features = [ "serde-serialization" ]
[dependencies.msg]
path = "../msg"
[dependencies.ipc-channel] [dependencies.ipc-channel]
git = "https://github.com/pcwalton/ipc-channel" git = "https://github.com/pcwalton/ipc-channel"

View file

@ -23,6 +23,7 @@ use hyper::net::{Fresh, HttpsConnector, Openssl};
use hyper::status::{StatusClass, StatusCode}; use hyper::status::{StatusClass, StatusCode};
use log; use log;
use mime_classifier::MIMEClassifier; use mime_classifier::MIMEClassifier;
use msg::constellation_msg::{PipelineId};
use net_traits::ProgressMsg::{Done, Payload}; use net_traits::ProgressMsg::{Done, Payload};
use net_traits::hosts::replace_hosts; use net_traits::hosts::replace_hosts;
use net_traits::{CookieSource, IncludeSubdomains, LoadConsumer, LoadData, Metadata}; use net_traits::{CookieSource, IncludeSubdomains, LoadConsumer, LoadData, Metadata};
@ -446,10 +447,12 @@ fn send_request_to_devtools(devtools_chan: Option<Sender<DevtoolsControlMsg>>,
url: Url, url: Url,
method: Method, method: Method,
headers: Headers, headers: Headers,
body: Option<Vec<u8>>) { body: Option<Vec<u8>>,
pipeline_id: PipelineId) {
if let Some(ref chan) = devtools_chan { if let Some(ref chan) = devtools_chan {
let request = DevtoolsHttpRequest { url: url, method: method, headers: headers, body: body }; let request = DevtoolsHttpRequest {
url: url, method: method, headers: headers, body: body, pipeline_id: pipeline_id };
let net_event = NetworkEvent::HttpRequest(request); let net_event = NetworkEvent::HttpRequest(request);
let msg = ChromeToDevtoolsControlMsg::NetworkEvent(request_id, net_event); let msg = ChromeToDevtoolsControlMsg::NetworkEvent(request_id, net_event);
@ -460,9 +463,10 @@ fn send_request_to_devtools(devtools_chan: Option<Sender<DevtoolsControlMsg>>,
fn send_response_to_devtools(devtools_chan: Option<Sender<DevtoolsControlMsg>>, fn send_response_to_devtools(devtools_chan: Option<Sender<DevtoolsControlMsg>>,
request_id: String, request_id: String,
headers: Option<Headers>, headers: Option<Headers>,
status: Option<RawStatus>) { status: Option<RawStatus>,
pipeline_id: PipelineId) {
if let Some(ref chan) = devtools_chan { if let Some(ref chan) = devtools_chan {
let response = DevtoolsHttpResponse { headers: headers, status: status, body: None }; let response = DevtoolsHttpResponse { headers: headers, status: status, body: None, pipeline_id: pipeline_id };
let net_event_response = NetworkEvent::HttpResponse(response); let net_event_response = NetworkEvent::HttpResponse(response);
let msg = ChromeToDevtoolsControlMsg::NetworkEvent(request_id, net_event_response); let msg = ChromeToDevtoolsControlMsg::NetworkEvent(request_id, net_event_response);
@ -600,35 +604,30 @@ pub fn load<A>(load_data: LoadData,
// //
// https://tools.ietf.org/html/rfc7231#section-6.4 // https://tools.ietf.org/html/rfc7231#section-6.4
let is_redirected_request = iters != 1; let is_redirected_request = iters != 1;
let cloned_data;
let maybe_response = match load_data.data { let maybe_response = match load_data.data {
Some(ref data) if !is_redirected_request => { Some(ref data) if !is_redirected_request => {
req.headers_mut().set(ContentLength(data.len() as u64)); req.headers_mut().set(ContentLength(data.len() as u64));
cloned_data = load_data.data.clone();
// TODO: Do this only if load_data has some pipeline_id, and send the pipeline_id
// in the message
send_request_to_devtools(
devtools_chan.clone(), request_id.clone(), url.clone(),
method.clone(), load_data.headers.clone(),
load_data.data.clone()
);
req.send(&load_data.data) req.send(&load_data.data)
} }
_ => { _ => {
if load_data.method != Method::Get && load_data.method != Method::Head { if load_data.method != Method::Get && load_data.method != Method::Head {
req.headers_mut().set(ContentLength(0)) req.headers_mut().set(ContentLength(0))
} }
cloned_data = None;
send_request_to_devtools(
devtools_chan.clone(), request_id.clone(), url.clone(),
method.clone(), load_data.headers.clone(),
None
);
req.send(&None) req.send(&None)
} }
}; };
if let Some(pipeline_id) = load_data.pipeline_id {
send_request_to_devtools(
devtools_chan.clone(), request_id.clone(), url.clone(),
method.clone(), request_headers.clone(),
cloned_data, pipeline_id
);
}
response = match maybe_response { response = match maybe_response {
Ok(r) => r, Ok(r) => r,
Err(LoadError::ConnectionAborted(reason)) => { Err(LoadError::ConnectionAborted(reason)) => {
@ -704,13 +703,13 @@ pub fn load<A>(load_data: LoadData,
// --- Tell devtools that we got a response // --- Tell devtools that we got a response
// Send an HttpResponse message to devtools with the corresponding request_id // Send an HttpResponse message to devtools with the corresponding request_id
// TODO: Send this message only if load_data has a pipeline_id that is not None
// TODO: Send this message even when the load fails? // TODO: Send this message even when the load fails?
send_response_to_devtools( if let Some(pipeline_id) = load_data.pipeline_id {
devtools_chan, request_id, send_response_to_devtools(
metadata.headers.clone(), metadata.status.clone() devtools_chan, request_id,
); metadata.headers.clone(), metadata.status.clone(),
pipeline_id);
}
return StreamedResponse::from_http_response(response, metadata) return StreamedResponse::from_http_response(response, metadata)
} }
} }

View file

@ -461,7 +461,7 @@ pub fn new_image_cache_task(resource_task: ResourceTask) -> ImageCacheTask {
placeholder_url.push("rippy.jpg"); placeholder_url.push("rippy.jpg");
let placeholder_image = match Url::from_file_path(&*placeholder_url) { let placeholder_image = match Url::from_file_path(&*placeholder_url) {
Ok(url) => { Ok(url) => {
match load_whole_resource(&resource_task, url) { match load_whole_resource(&resource_task, url, None) {
Err(..) => { Err(..) => {
debug!("image_cache_task: failed loading the placeholder."); debug!("image_cache_task: failed loading the placeholder.");
None None

View file

@ -20,6 +20,7 @@ extern crate flate2;
extern crate brotli; extern crate brotli;
extern crate hyper; extern crate hyper;
extern crate ipc_channel; extern crate ipc_channel;
extern crate msg;
extern crate net_traits; extern crate net_traits;
extern crate openssl; extern crate openssl;
extern crate rustc_serialize; extern crate rustc_serialize;

View file

@ -383,10 +383,10 @@ pub enum ProgressMsg {
} }
/// Convenience function for synchronously loading a whole resource. /// Convenience function for synchronously loading a whole resource.
pub fn load_whole_resource(resource_task: &ResourceTask, url: Url) pub fn load_whole_resource(resource_task: &ResourceTask, url: Url, pipeline_id: Option<PipelineId>)
-> Result<(Metadata, Vec<u8>), String> { -> Result<(Metadata, Vec<u8>), String> {
let (start_chan, start_port) = ipc::channel().unwrap(); let (start_chan, start_port) = ipc::channel().unwrap();
resource_task.send(ControlMsg::Load(LoadData::new(url, None), resource_task.send(ControlMsg::Load(LoadData::new(url, pipeline_id),
LoadConsumer::Channel(start_chan))).unwrap(); LoadConsumer::Channel(start_chan))).unwrap();
let response = start_port.recv().unwrap(); let response = start_port.recv().unwrap();

View file

@ -78,6 +78,7 @@ impl DocumentLoader {
pending.load_async(listener) pending.load_async(listener)
} }
/// Mark an in-progress network request complete. /// Mark an in-progress network request complete.
pub fn finish_load(&mut self, load: LoadType) { pub fn finish_load(&mut self, load: LoadType) {
let idx = self.blocking_loads.iter().position(|unfinished| *unfinished == load); let idx = self.blocking_loads.iter().position(|unfinished| *unfinished == load);

View file

@ -231,7 +231,7 @@ impl DedicatedWorkerGlobalScope {
let roots = RootCollection::new(); let roots = RootCollection::new();
let _stack_roots_tls = StackRootTLS::new(&roots); let _stack_roots_tls = StackRootTLS::new(&roots);
let (url, source) = match load_whole_resource(&init.resource_task, worker_url) { let (url, source) = match load_whole_resource(&init.resource_task, worker_url, None) {
Err(_) => { Err(_) => {
println!("error loading script {}", serialized_worker_url); println!("error loading script {}", serialized_worker_url);
parent_sender.send(CommonScriptMsg::RunnableMsg(WorkerEvent, parent_sender.send(CommonScriptMsg::RunnableMsg(WorkerEvent,

View file

@ -193,7 +193,7 @@ impl WorkerGlobalScopeMethods for WorkerGlobalScope {
} }
for url in urls { for url in urls {
let (url, source) = match load_whole_resource(&self.resource_task, url) { let (url, source) = match load_whole_resource(&self.resource_task, url, None) {
Err(_) => return Err(Error::Network), Err(_) => return Err(Error::Network),
Ok((metadata, bytes)) => { Ok((metadata, bytes)) => {
(metadata.final_url, String::from_utf8(bytes).unwrap()) (metadata.final_url, String::from_utf8(bytes).unwrap())

View file

@ -1180,6 +1180,7 @@ dependencies = [
"hyper 0.6.15 (registry+https://github.com/rust-lang/crates.io-index)", "hyper 0.6.15 (registry+https://github.com/rust-lang/crates.io-index)",
"ipc-channel 0.1.0 (git+https://github.com/pcwalton/ipc-channel)", "ipc-channel 0.1.0 (git+https://github.com/pcwalton/ipc-channel)",
"log 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)",
"msg 0.0.1",
"net_traits 0.0.1", "net_traits 0.0.1",
"openssl 0.6.7 (registry+https://github.com/rust-lang/crates.io-index)", "openssl 0.6.7 (registry+https://github.com/rust-lang/crates.io-index)",
"plugins 0.0.1", "plugins 0.0.1",
@ -1201,6 +1202,7 @@ dependencies = [
"flate2 0.2.9 (registry+https://github.com/rust-lang/crates.io-index)", "flate2 0.2.9 (registry+https://github.com/rust-lang/crates.io-index)",
"hyper 0.6.15 (registry+https://github.com/rust-lang/crates.io-index)", "hyper 0.6.15 (registry+https://github.com/rust-lang/crates.io-index)",
"ipc-channel 0.1.0 (git+https://github.com/pcwalton/ipc-channel)", "ipc-channel 0.1.0 (git+https://github.com/pcwalton/ipc-channel)",
"msg 0.0.1",
"net 0.0.1", "net 0.0.1",
"net_traits 0.0.1", "net_traits 0.0.1",
"time 0.1.32 (registry+https://github.com/rust-lang/crates.io-index)", "time 0.1.32 (registry+https://github.com/rust-lang/crates.io-index)",

View file

@ -17,6 +17,9 @@ path = "../../../components/net_traits"
[dependencies.util] [dependencies.util]
path = "../../../components/util" path = "../../../components/util"
[dependencies.msg]
path = "../../../components/msg"
[dependencies.devtools_traits] [dependencies.devtools_traits]
path = "../../../components/devtools_traits" path = "../../../components/devtools_traits"

View file

@ -2,6 +2,7 @@
* License, v. 2.0. If a copy of the MPL was not distributed with this * 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/. */ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
use cookie_rs::Cookie as CookiePair; use cookie_rs::Cookie as CookiePair;
use devtools_traits::HttpRequest as DevtoolsHttpRequest; use devtools_traits::HttpRequest as DevtoolsHttpRequest;
use devtools_traits::HttpResponse as DevtoolsHttpResponse; use devtools_traits::HttpResponse as DevtoolsHttpResponse;
@ -15,6 +16,7 @@ use hyper::http::RawStatus;
use hyper::method::Method; use hyper::method::Method;
use hyper::mime::{Mime, SubLevel, TopLevel}; use hyper::mime::{Mime, SubLevel, TopLevel};
use hyper::status::StatusCode; use hyper::status::StatusCode;
use msg::constellation_msg::PipelineId;
use net::cookie::Cookie; use net::cookie::Cookie;
use net::cookie_storage::CookieStorage; use net::cookie_storage::CookieStorage;
use net::hsts::{HSTSList}; use net::hsts::{HSTSList};
@ -382,7 +384,9 @@ fn test_request_and_response_data_with_network_messages() {
let url = Url::parse("https://mozilla.com").unwrap(); let url = Url::parse("https://mozilla.com").unwrap();
let (devtools_chan, devtools_port) = mpsc::channel::<DevtoolsControlMsg>(); let (devtools_chan, devtools_port) = mpsc::channel::<DevtoolsControlMsg>();
let mut load_data = LoadData::new(url.clone(), None); // This will probably have to be changed as it uses fake_root_pipeline_id which is marked for removal.
let pipeline_id = PipelineId::fake_root_pipeline_id();
let mut load_data = LoadData::new(url.clone(), Some(pipeline_id));
let mut request_headers = Headers::new(); let mut request_headers = Headers::new();
request_headers.set(Host { hostname: "bar.foo".to_owned(), port: None }); request_headers.set(Host { hostname: "bar.foo".to_owned(), port: None });
load_data.headers = request_headers.clone(); load_data.headers = request_headers.clone();
@ -393,11 +397,25 @@ fn test_request_and_response_data_with_network_messages() {
let devhttprequest = expect_devtools_http_request(&devtools_port); let devhttprequest = expect_devtools_http_request(&devtools_port);
let devhttpresponse = expect_devtools_http_response(&devtools_port); let devhttpresponse = expect_devtools_http_response(&devtools_port);
//Creating default headers for request
let mut headers = Headers::new();
headers.set(AcceptEncoding(vec![qitem(Encoding::Gzip), qitem(Encoding::Deflate)]));
headers.set(Host { hostname: "mozilla.com".to_owned() , port: None });
let accept = Accept(vec![
qitem(Mime(TopLevel::Text, SubLevel::Html, vec![])),
qitem(Mime(TopLevel::Application, SubLevel::Ext("xhtml+xml".to_owned()), vec![])),
QualityItem::new(Mime(TopLevel::Application, SubLevel::Xml, vec![]), Quality(900u16)),
QualityItem::new(Mime(TopLevel::Star, SubLevel::Star, vec![]), Quality(800u16)),
]);
headers.set(accept);
headers.set(UserAgent(DEFAULT_USER_AGENT.to_string()));
let httprequest = DevtoolsHttpRequest { let httprequest = DevtoolsHttpRequest {
url: url, url: url,
method: Method::Get, method: Method::Get,
headers: request_headers, headers: headers,
body: None, body: None,
pipeline_id: pipeline_id,
}; };
let content = "Yay!"; let content = "Yay!";
@ -408,13 +426,45 @@ fn test_request_and_response_data_with_network_messages() {
let httpresponse = DevtoolsHttpResponse { let httpresponse = DevtoolsHttpResponse {
headers: Some(response_headers), headers: Some(response_headers),
status: Some(RawStatus(200, Cow::Borrowed("Ok"))), status: Some(RawStatus(200, Cow::Borrowed("Ok"))),
body: None body: None,
pipeline_id: pipeline_id,
}; };
assert_eq!(devhttprequest, httprequest); assert_eq!(devhttprequest, httprequest);
assert_eq!(devhttpresponse, httpresponse); assert_eq!(devhttpresponse, httpresponse);
} }
#[test]
fn test_request_and_response_message_from_devtool_without_pipeline_id() {
struct Factory;
impl HttpRequestFactory for Factory {
type R = MockRequest;
fn create(&self, _: Url, _: Method) -> Result<MockRequest, LoadError> {
let mut headers = Headers::new();
headers.set(Host { hostname: "foo.bar".to_owned(), port: None });
Ok(MockRequest::new(
ResponseType::WithHeaders(<[_]>::to_vec("Yay!".as_bytes()), headers))
)
}
}
let hsts_list = Arc::new(RwLock::new(HSTSList::new()));
let cookie_jar = Arc::new(RwLock::new(CookieStorage::new()));
let url = Url::parse("https://mozilla.com").unwrap();
let (devtools_chan, devtools_port) = mpsc::channel::<DevtoolsControlMsg>();
let load_data = LoadData::new(url.clone(), None);
let _ = load::<MockRequest>(load_data, hsts_list, cookie_jar, Some(devtools_chan), &Factory,
DEFAULT_USER_AGENT.to_string());
// notification received from devtools
assert!(devtools_port.try_recv().is_err());
}
#[test] #[test]
fn test_load_when_redirecting_from_a_post_should_rewrite_next_request_as_get() { fn test_load_when_redirecting_from_a_post_should_rewrite_next_request_as_get() {
struct Factory; struct Factory;

View file

@ -7,6 +7,7 @@ extern crate devtools_traits;
extern crate flate2; extern crate flate2;
extern crate hyper; extern crate hyper;
extern crate ipc_channel; extern crate ipc_channel;
extern crate msg;
extern crate net; extern crate net;
extern crate net_traits; extern crate net_traits;
extern crate time; extern crate time;