aboutsummaryrefslogtreecommitdiffstats
path: root/components/net/http_loader.rs
diff options
context:
space:
mode:
Diffstat (limited to 'components/net/http_loader.rs')
-rw-r--r--components/net/http_loader.rs34
1 files changed, 20 insertions, 14 deletions
diff --git a/components/net/http_loader.rs b/components/net/http_loader.rs
index 9a028e5ce59..d8344e12502 100644
--- a/components/net/http_loader.rs
+++ b/components/net/http_loader.rs
@@ -24,7 +24,7 @@ use hyper::method::Method;
use hyper::mime::{Mime, SubLevel, TopLevel};
use hyper::net::Fresh;
use hyper::status::{StatusClass, StatusCode};
-use ipc_channel::ipc;
+use ipc_channel::ipc::{self, IpcSender};
use log;
use mime_classifier::MimeClassifier;
use msg::constellation_msg::{PipelineId, ReferrerPolicy};
@@ -32,7 +32,7 @@ use net_traits::ProgressMsg::{Done, Payload};
use net_traits::hosts::replace_hosts;
use net_traits::response::HttpsState;
use net_traits::{CookieSource, IncludeSubdomains, LoadConsumer, LoadContext, LoadData};
-use net_traits::{Metadata, NetworkError, RequestSource, CustomResponse};
+use net_traits::{Metadata, NetworkError, CustomResponse, CustomResponseMediator};
use openssl;
use openssl::ssl::error::{SslError, OpensslError};
use profile_traits::time::{ProfilerCategory, profile, ProfilerChan, TimerMetadata};
@@ -59,6 +59,7 @@ pub fn factory(user_agent: String,
http_state: HttpState,
devtools_chan: Option<Sender<DevtoolsControlMsg>>,
profiler_chan: ProfilerChan,
+ constellation_chan: Option<IpcSender<CustomResponseMediator>>,
connector: Arc<Pool<Connector>>)
-> Box<FnBox(LoadData,
LoadConsumer,
@@ -78,6 +79,7 @@ pub fn factory(user_agent: String,
connector,
http_state,
devtools_chan,
+ constellation_chan,
cancel_listener,
user_agent)
})
@@ -131,6 +133,7 @@ fn load_for_consumer(load_data: LoadData,
connector: Arc<Pool<Connector>>,
http_state: HttpState,
devtools_chan: Option<Sender<DevtoolsControlMsg>>,
+ constellation_chan: Option<IpcSender<CustomResponseMediator>>,
cancel_listener: CancellationListener,
user_agent: String) {
let factory = NetworkHttpRequestFactory {
@@ -140,7 +143,7 @@ fn load_for_consumer(load_data: LoadData,
let ui_provider = TFDProvider;
match load(&load_data, &ui_provider, &http_state,
devtools_chan, &factory,
- user_agent, &cancel_listener) {
+ user_agent, &cancel_listener, constellation_chan) {
Err(error) => {
match error.error {
LoadErrorType::ConnectionAborted { .. } => unreachable!(),
@@ -860,7 +863,8 @@ pub fn load<A, B>(load_data: &LoadData,
devtools_chan: Option<Sender<DevtoolsControlMsg>>,
request_factory: &HttpRequestFactory<R=A>,
user_agent: String,
- cancel_listener: &CancellationListener)
+ cancel_listener: &CancellationListener,
+ constellation_chan: Option<IpcSender<CustomResponseMediator>>)
-> Result<StreamedResponse, LoadError> where A: HttpRequest + 'static, B: UIProvider {
let max_redirects = PREFS.get("network.http.redirection-limit").as_i64().unwrap() as u32;
let mut iters = 0;
@@ -878,17 +882,19 @@ pub fn load<A, B>(load_data: &LoadData,
}
let (msg_sender, msg_receiver) = ipc::channel().unwrap();
- match load_data.source {
- RequestSource::Window(ref sender) | RequestSource::Worker(ref sender) => {
- sender.send(msg_sender.clone()).unwrap();
- let received_msg = msg_receiver.recv().unwrap();
- if let Some(custom_response) = received_msg {
- let metadata = Metadata::default(doc_url.clone());
- let readable_response = to_readable_response(custom_response);
- return StreamedResponse::from_http_response(box readable_response, metadata);
- }
+ let response_mediator = CustomResponseMediator {
+ response_chan: msg_sender,
+ load_url: doc_url.clone()
+ };
+ if let Some(sender) = constellation_chan {
+ let _ = sender.send(response_mediator);
+ if let Ok(Some(custom_response)) = msg_receiver.try_recv() {
+ let metadata = Metadata::default(doc_url.clone());
+ let readable_response = to_readable_response(custom_response);
+ return StreamedResponse::from_http_response(box readable_response, metadata);
}
- RequestSource::None => {}
+ } else {
+ debug!("Did not receive a custom response");
}
// If the URL is a view-source scheme then the scheme data contains the