diff --git a/Cargo.lock b/Cargo.lock index 47ff9585dd7..e24486480dd 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1868,7 +1868,7 @@ dependencies = [ "profile_traits 0.0.1", "serde 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "servo-websocket 0.20.0 (registry+https://github.com/rust-lang/crates.io-index)", + "servo-websocket 0.21.0 (registry+https://github.com/rust-lang/crates.io-index)", "servo_config 0.0.1", "servo_url 0.0.1", "threadpool 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2742,16 +2742,15 @@ dependencies = [ [[package]] name = "servo-websocket" -version = "0.20.0" +version = "0.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ + "base64 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", "bitflags 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "hyper 0.10.13 (registry+https://github.com/rust-lang/crates.io-index)", - "net2 0.2.29 (registry+https://github.com/rust-lang/crates.io-index)", - "openssl 0.9.22 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc-serialize 0.3.24 (registry+https://github.com/rust-lang/crates.io-index)", + "sha1 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "unicase 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "url 1.6.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -3915,7 +3914,7 @@ dependencies = [ "checksum servo-fontconfig-sys 4.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "38b494f03009ee81914b0e7d387ad7c145cafcd69747c2ec89b0e17bb94f303a" "checksum servo-freetype-sys 4.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "9232032c2e85118c0282c6562c84cab12316e655491ba0a5d1905b2320060d1b" "checksum servo-skia 0.30000013.1 (registry+https://github.com/rust-lang/crates.io-index)" = "3fb707c7dc3d8a053b8c9d48ed9eb7f2a0c0751616dfbe3598f526948408bc33" -"checksum servo-websocket 0.20.0 (registry+https://github.com/rust-lang/crates.io-index)" = "efde78dfcf2178d5a11e1e2268e0d8df0627dfe2724546db8585d6678e1af150" +"checksum servo-websocket 0.21.0 (registry+https://github.com/rust-lang/crates.io-index)" = "6bac1e2295e72f0525147d993c626761811acf0441dac1cee8707f12dc7f3363" "checksum sha1 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "cc30b1e1e8c40c121ca33b86c23308a090d19974ef001b4bf6e61fd1a0fb095c" "checksum shared_library 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "fb04126b6fcfd2710fb5b6d18f4207b6c535f2850a7e1a43bcd526d44f30a79a" "checksum sig 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c6649e43c1a1e68d29ed56d0dc3b5b6cf3b901da77cf107c4066b9e3da036df5" diff --git a/components/net/Cargo.toml b/components/net/Cargo.toml index 27807663744..b9f24ebac34 100644 --- a/components/net/Cargo.toml +++ b/components/net/Cargo.toml @@ -35,7 +35,7 @@ serde = "1.0" serde_json = "1.0" servo_config = {path = "../config"} servo_url = {path = "../url"} -servo-websocket = "0.20" +servo-websocket = { version = "0.21", default-features = false, features = ["sync"] } threadpool = "1.0" time = "0.1.17" unicase = "1.4.0" diff --git a/components/net/websocket_loader.rs b/components/net/websocket_loader.rs index d369300ecd2..77140631e7a 100644 --- a/components/net/websocket_loader.rs +++ b/components/net/websocket_loader.rs @@ -26,11 +26,12 @@ use std::sync::{Arc, Mutex}; use std::sync::atomic::{AtomicBool, Ordering}; use std::thread; use url::Position; -use websocket::{Message, Receiver as WSReceiver, Sender as WSSender}; +use websocket::Message; use websocket::header::{Origin, WebSocketAccept, WebSocketKey, WebSocketProtocol, WebSocketVersion}; -use websocket::message::Type as MessageType; -use websocket::receiver::Receiver; -use websocket::sender::Sender; +use websocket::message::OwnedMessage; +use websocket::receiver::{Reader as WsReader, Receiver as WsReceiver}; +use websocket::sender::{Sender as WsSender, Writer as WsWriter}; +use websocket::ws::dataframe::DataFrame; pub fn init( req_init: RequestInit, @@ -60,7 +61,7 @@ pub fn init( let ws_sender_incoming = ws_sender.clone(); thread::spawn(move || { for message in receiver.incoming_messages() { - let message: Message = match message { + let message = match message { Ok(m) => m, Err(e) => { debug!("Error receiving incoming WebSocket message: {:?}", e); @@ -68,21 +69,25 @@ pub fn init( break; } }; - let message = match message.opcode { - MessageType::Text => MessageData::Text(String::from_utf8_lossy(&message.payload).into_owned()), - MessageType::Binary => MessageData::Binary(message.payload.into_owned()), - MessageType::Ping => { - let pong = Message::pong(message.payload); + let message = match message { + OwnedMessage::Text(_) => { + MessageData::Text(String::from_utf8_lossy(&message.take_payload()).into_owned()) + }, + OwnedMessage::Binary(_) => MessageData::Binary(message.take_payload()), + OwnedMessage::Ping(_) => { + let pong = Message::pong(message.take_payload()); ws_sender_incoming.lock().unwrap().send_message(&pong).unwrap(); continue; }, - MessageType::Pong => continue, - MessageType::Close => { + OwnedMessage::Pong(_) => continue, + OwnedMessage::Close(ref msg) => { if !initiated_close_incoming.fetch_or(true, Ordering::SeqCst) { ws_sender_incoming.lock().unwrap().send_message(&message).unwrap(); } - let code = message.cd_status_code; - let reason = String::from_utf8_lossy(&message.payload).into_owned(); + let (code, reason) = match *msg { + None => (None, "".into()), + Some(ref data) => (Some(data.status_code), data.reason.clone()) + }; let _ = resource_event_sender.send(WebSocketNetworkEvent::Close(code, reason)); break; }, @@ -148,7 +153,7 @@ fn obtain_a_websocket_connection(url: &ServoUrl) -> Result fn establish_a_websocket_connection( req_init: RequestInit, http_state: &HttpState -) -> Result<(Option, Sender, Receiver), NetworkError> +) -> Result<(Option, WsWriter, WsReader), NetworkError> { let protocols = match req_init.mode { RequestMode::WebSocket { protocols } => protocols.clone(), @@ -255,9 +260,19 @@ fn establish_a_websocket_connection( None }; - let sender = Sender::new(response.writer, true); - let receiver = Receiver::new(response.reader, false); - Ok((protocol_in_use, sender, receiver)) + let sender = WsSender::new(true); + let writer = WsWriter { + stream: response.writer, + sender + }; + + let receiver = WsReceiver::new(false); + let reader = WsReader { + stream: response.reader, + receiver, + }; + + Ok((protocol_in_use, writer, reader)) } struct Response {