diff options
author | bors-servo <metajack+bors@gmail.com> | 2015-07-14 02:06:17 -0600 |
---|---|---|
committer | bors-servo <metajack+bors@gmail.com> | 2015-07-14 02:06:17 -0600 |
commit | d91a6f3834aa7fbf47148480e16d06d9e3891340 (patch) | |
tree | 1ced2645d328827eaa3371dab0808b8c71208c6b /components/script/dom/websocket.rs | |
parent | 6a728712f9c9cbe667c1bca2465cefef6f6f657a (diff) | |
parent | 86e94786ae281eea5b2bae30c76e5730ce448a79 (diff) | |
download | servo-d91a6f3834aa7fbf47148480e16d06d9e3891340.tar.gz servo-d91a6f3834aa7fbf47148480e16d06d9e3891340.zip |
Auto merge of #6620 - Ms2ger:ws-crash, r=jdm
Stop panicking while establishing a WebSocket connection.
<!-- Reviewable:start -->
[<img src="https://reviewable.io/review_button.png" height=40 alt="Review on Reviewable"/>](https://reviewable.io/reviews/servo/servo/6620)
<!-- Reviewable:end -->
Diffstat (limited to 'components/script/dom/websocket.rs')
-rw-r--r-- | components/script/dom/websocket.rs | 28 |
1 files changed, 19 insertions, 9 deletions
diff --git a/components/script/dom/websocket.rs b/components/script/dom/websocket.rs index effa8b54112..13423097cba 100644 --- a/components/script/dom/websocket.rs +++ b/components/script/dom/websocket.rs @@ -33,6 +33,7 @@ use websocket::stream::WebSocketStream; use websocket::client::request::Url; use websocket::Client; use websocket::header::Origin; +use websocket::result::WebSocketResult; #[derive(JSTraceable, PartialEq, Copy, Clone)] enum WebSocketRequestState { @@ -101,6 +102,19 @@ fn parse_web_socket_url(url_str: &str) -> Fallible<(Url, String, u16, String, bo Ok((parsed_url, host, port, resource, secure)) } +/// *Establish a WebSocket Connection* as defined in RFC 6455. +fn establish_a_websocket_connection(url: Url, origin: String) + -> WebSocketResult<(Sender<WebSocketStream>, Receiver<WebSocketStream>)> { + let mut request = try!(Client::connect(url)); + request.headers.set(Origin(origin)); + + let response = try!(request.send()); + try!(response.validate()); + + Ok(response.begin().split()) +} + + impl WebSocket { pub fn new_inherited(global: GlobalRef, url: Url) -> WebSocket { WebSocket { @@ -138,11 +152,11 @@ impl WebSocket { global, WebSocketBinding::Wrap); - // TODO Client::connect does not conform to RFC 6455 - // see https://github.com/cyderize/rust-websocket/issues/38 - let mut request = match Client::connect(url) { - Ok(request) => request, - Err(_) => { + let channel = establish_a_websocket_connection(url, global.get_url().serialize()); + let (temp_sender, temp_receiver) = match channel { + Ok(channel) => channel, + Err(e) => { + debug!("Failed to establish a WebSocket connection: {:?}", e); let global_root = ws.r().global.root(); let address = Trusted::new(global_root.r().get_cx(), ws.r(), global_root.r().script_chan().clone()); let task = box WebSocketTaskHandler::new(address, WebSocketTask::Close); @@ -150,11 +164,7 @@ impl WebSocket { return Ok(ws); } }; - request.headers.set(Origin(global.get_url().serialize())); - let response = request.send().unwrap(); - response.validate().unwrap(); - let (temp_sender, temp_receiver) = response.begin().split(); *ws.r().sender.borrow_mut() = Some(temp_sender); *ws.r().receiver.borrow_mut() = Some(temp_receiver); |