aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom/websocket.rs
diff options
context:
space:
mode:
authorbors-servo <metajack+bors@gmail.com>2015-07-14 02:06:17 -0600
committerbors-servo <metajack+bors@gmail.com>2015-07-14 02:06:17 -0600
commitd91a6f3834aa7fbf47148480e16d06d9e3891340 (patch)
tree1ced2645d328827eaa3371dab0808b8c71208c6b /components/script/dom/websocket.rs
parent6a728712f9c9cbe667c1bca2465cefef6f6f657a (diff)
parent86e94786ae281eea5b2bae30c76e5730ce448a79 (diff)
downloadservo-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.rs28
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);