aboutsummaryrefslogtreecommitdiffstats
path: root/components/net
diff options
context:
space:
mode:
Diffstat (limited to 'components/net')
-rw-r--r--components/net/resource_thread.rs29
-rw-r--r--components/net/websocket_loader.rs47
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 {