diff options
Diffstat (limited to 'components/net')
-rw-r--r-- | components/net/resource_thread.rs | 29 | ||||
-rw-r--r-- | components/net/websocket_loader.rs | 47 |
2 files changed, 42 insertions, 34 deletions
diff --git a/components/net/resource_thread.rs b/components/net/resource_thread.rs index 8d1c3b75764..9e1a3c9eee7 100644 --- a/components/net/resource_thread.rs +++ b/components/net/resource_thread.rs @@ -16,9 +16,9 @@ use http_loader::{HttpState, http_redirect_fetch}; use hyper_serde::Serde; use ipc_channel::ipc::{self, IpcReceiver, IpcReceiverSet, IpcSender}; use net_traits::{CookieSource, CoreResourceThread}; -use net_traits::{CoreResourceMsg, FetchResponseMsg}; +use net_traits::{CoreResourceMsg, FetchChannels, FetchResponseMsg}; use net_traits::{CustomResponseMediator, ResourceId}; -use net_traits::{ResourceThreads, WebSocketCommunicate, WebSocketConnectData}; +use net_traits::{ResourceThreads, WebSocketDomAction, WebSocketNetworkEvent}; use net_traits::request::{Request, RequestInit}; use net_traits::response::{Response, ResponseInit}; use net_traits::storage_thread::StorageThreadMsg; @@ -155,12 +155,16 @@ impl ResourceChannelManager { msg: CoreResourceMsg, http_state: &Arc<HttpState>) -> bool { match msg { - CoreResourceMsg::Fetch(req_init, sender) => - self.resource_manager.fetch(req_init, None, sender, http_state), + CoreResourceMsg::Fetch(req_init, channels) => { + match channels { + FetchChannels::ResponseMsg(sender) => + self.resource_manager.fetch(req_init, None, sender, http_state), + FetchChannels::WebSocket { event_sender, action_receiver } => + self.resource_manager.websocket_connect(req_init, event_sender, action_receiver, http_state), + } + } CoreResourceMsg::FetchRedirect(req_init, res_init, sender) => self.resource_manager.fetch(req_init, Some(res_init), sender, http_state), - CoreResourceMsg::WebsocketConnect(connect, connect_data) => - self.resource_manager.websocket_connect(connect, connect_data, http_state), CoreResourceMsg::SetCookieForUrl(request, cookie, source) => self.resource_manager.set_cookie_for_url(&request, cookie.into_inner(), source, http_state), CoreResourceMsg::SetCookiesForUrl(request, cookies, source) => { @@ -360,10 +364,13 @@ impl CoreResourceManager { }).expect("Thread spawning failed"); } - fn websocket_connect(&self, - connect: WebSocketCommunicate, - connect_data: WebSocketConnectData, - http_state: &Arc<HttpState>) { - websocket_loader::init(connect, connect_data, http_state.clone()); + fn websocket_connect( + &self, + request: RequestInit, + event_sender: IpcSender<WebSocketNetworkEvent>, + action_receiver: IpcReceiver<WebSocketDomAction>, + http_state: &Arc<HttpState> + ) { + websocket_loader::init(request, event_sender, action_receiver, http_state.clone()); } } diff --git a/components/net/websocket_loader.rs b/components/net/websocket_loader.rs index 3a9345cfac5..41ac34262b5 100644 --- a/components/net/websocket_loader.rs +++ b/components/net/websocket_loader.rs @@ -15,9 +15,10 @@ use hyper::method::Method; use hyper::net::HttpStream; use hyper::status::StatusCode; use hyper::version::HttpVersion; -use net_traits::{CookieSource, MessageData, NetworkError, WebSocketCommunicate, WebSocketConnectData}; +use ipc_channel::ipc::{IpcReceiver, IpcSender}; +use net_traits::{CookieSource, MessageData, NetworkError}; use net_traits::{WebSocketDomAction, WebSocketNetworkEvent}; -use net_traits::request::Destination; +use net_traits::request::{Destination, RequestInit, RequestMode}; use servo_url::ServoUrl; use std::ascii::AsciiExt; use std::io::{self, Write}; @@ -32,22 +33,22 @@ use websocket::message::Type as MessageType; use websocket::receiver::Receiver; use websocket::sender::Sender; -pub fn init(connect: WebSocketCommunicate, - connect_data: WebSocketConnectData, - http_state: Arc<HttpState>) { - thread::Builder::new().name(format!("WebSocket connection to {}", connect_data.resource_url)).spawn(move || { - let channel = establish_a_websocket_connection(connect_data.resource_url, - connect_data.origin, - connect_data.protocols, - &http_state); +pub fn init( + req_init: RequestInit, + resource_event_sender: IpcSender<WebSocketNetworkEvent>, + dom_action_receiver: IpcReceiver<WebSocketDomAction>, + http_state: Arc<HttpState> +) { + thread::Builder::new().name(format!("WebSocket connection to {}", req_init.url)).spawn(move || { + let channel = establish_a_websocket_connection(req_init, &http_state); let (ws_sender, mut receiver) = match channel { Ok((protocol_in_use, sender, receiver)) => { - let _ = connect.event_sender.send(WebSocketNetworkEvent::ConnectionEstablished { protocol_in_use }); + let _ = resource_event_sender.send(WebSocketNetworkEvent::ConnectionEstablished { protocol_in_use }); (sender, receiver) }, Err(e) => { debug!("Failed to establish a WebSocket connection: {:?}", e); - let _ = connect.event_sender.send(WebSocketNetworkEvent::Fail); + let _ = resource_event_sender.send(WebSocketNetworkEvent::Fail); return; } @@ -58,7 +59,6 @@ pub fn init(connect: WebSocketCommunicate, let initiated_close_incoming = initiated_close.clone(); let ws_sender_incoming = ws_sender.clone(); - let resource_event_sender = connect.event_sender; thread::spawn(move || { for message in receiver.incoming_messages() { let message: Message = match message { @@ -92,7 +92,7 @@ pub fn init(connect: WebSocketCommunicate, } }); - while let Ok(dom_action) = connect.action_receiver.recv() { + while let Ok(dom_action) = dom_action_receiver.recv() { match dom_action { WebSocketDomAction::SendMessage(MessageData::Text(data)) => { ws_sender.lock().unwrap().send_message(&Message::text(data)).unwrap(); @@ -146,14 +146,15 @@ fn obtain_a_websocket_connection(url: &ServoUrl) -> Result<Stream, NetworkError> } // https://fetch.spec.whatwg.org/#concept-websocket-establish -fn establish_a_websocket_connection(resource_url: ServoUrl, - origin: String, - protocols: Vec<String>, - http_state: &HttpState) - -> Result<(Option<String>, - Sender<Stream>, - Receiver<Stream>), - NetworkError> { +fn establish_a_websocket_connection( + req_init: RequestInit, + http_state: &HttpState +) -> Result<(Option<String>, Sender<Stream>, Receiver<Stream>), NetworkError> +{ + let protocols = match req_init.mode { + RequestMode::WebSocket { protocols } => protocols.clone(), + _ => panic!("Received a RequestInit with a non-websocket mode in websocket_loader"), + }; // Steps 1 is not really applicable here, given we don't exactly go // through the same infrastructure as the Fetch spec. @@ -184,7 +185,7 @@ fn establish_a_websocket_connection(resource_url: ServoUrl, // TODO: handle permessage-deflate extension. // Step 11 and network error check from step 12. - let response = fetch(resource_url, origin, headers, http_state)?; + let response = fetch(req_init.url, req_init.origin.ascii_serialization(), headers, http_state)?; // Step 12, the status code check. if response.status != StatusCode::SwitchingProtocols { |