diff options
27 files changed, 44 insertions, 71 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); diff --git a/tests/wpt/metadata/websockets/constructor/022.html.ini b/tests/wpt/metadata/websockets/constructor/022.html.ini index 975dd53c8ac..8cc8624b3a9 100644 --- a/tests/wpt/metadata/websockets/constructor/022.html.ini +++ b/tests/wpt/metadata/websockets/constructor/022.html.ini @@ -1,3 +1,6 @@ [022.html] type: testharness - expected: CRASH + expected: TIMEOUT + [WebSockets: protocol array] + expected: TIMEOUT + diff --git a/tests/wpt/metadata/websockets/interfaces/WebSocket/bufferedAmount/bufferedAmount-initial.html.ini b/tests/wpt/metadata/websockets/interfaces/WebSocket/bufferedAmount/bufferedAmount-initial.html.ini index 977cd43a8c2..980ce5201dd 100644 --- a/tests/wpt/metadata/websockets/interfaces/WebSocket/bufferedAmount/bufferedAmount-initial.html.ini +++ b/tests/wpt/metadata/websockets/interfaces/WebSocket/bufferedAmount/bufferedAmount-initial.html.ini @@ -1,3 +1,5 @@ [bufferedAmount-initial.html] type: testharness - expected: CRASH + [WebSockets: getting bufferedAmount] + expected: FAIL + diff --git a/tests/wpt/metadata/websockets/interfaces/WebSocket/bufferedAmount/bufferedAmount-readonly.html.ini b/tests/wpt/metadata/websockets/interfaces/WebSocket/bufferedAmount/bufferedAmount-readonly.html.ini index cff17b34408..69aec0c72f4 100644 --- a/tests/wpt/metadata/websockets/interfaces/WebSocket/bufferedAmount/bufferedAmount-readonly.html.ini +++ b/tests/wpt/metadata/websockets/interfaces/WebSocket/bufferedAmount/bufferedAmount-readonly.html.ini @@ -1,3 +1,5 @@ [bufferedAmount-readonly.html] type: testharness - expected: CRASH + [WebSockets: setting bufferedAmount] + expected: FAIL + diff --git a/tests/wpt/metadata/websockets/interfaces/WebSocket/close/close-connecting.html.ini b/tests/wpt/metadata/websockets/interfaces/WebSocket/close/close-connecting.html.ini index 7e789067248..a181d51f56b 100644 --- a/tests/wpt/metadata/websockets/interfaces/WebSocket/close/close-connecting.html.ini +++ b/tests/wpt/metadata/websockets/interfaces/WebSocket/close/close-connecting.html.ini @@ -1,3 +1,5 @@ [close-connecting.html] type: testharness - expected: CRASH + [WebSockets: close() when connecting] + expected: FAIL + diff --git a/tests/wpt/metadata/websockets/interfaces/WebSocket/close/close-replace.html.ini b/tests/wpt/metadata/websockets/interfaces/WebSocket/close/close-replace.html.ini deleted file mode 100644 index 7791be242c5..00000000000 --- a/tests/wpt/metadata/websockets/interfaces/WebSocket/close/close-replace.html.ini +++ /dev/null @@ -1,3 +0,0 @@ -[close-replace.html] - type: testharness - expected: CRASH diff --git a/tests/wpt/metadata/websockets/interfaces/WebSocket/constants/001.html.ini b/tests/wpt/metadata/websockets/interfaces/WebSocket/constants/001.html.ini deleted file mode 100644 index 67f5d9b0879..00000000000 --- a/tests/wpt/metadata/websockets/interfaces/WebSocket/constants/001.html.ini +++ /dev/null @@ -1,3 +0,0 @@ -[001.html] - type: testharness - expected: CRASH diff --git a/tests/wpt/metadata/websockets/interfaces/WebSocket/constants/002.html.ini b/tests/wpt/metadata/websockets/interfaces/WebSocket/constants/002.html.ini deleted file mode 100644 index fe7c6057cbd..00000000000 --- a/tests/wpt/metadata/websockets/interfaces/WebSocket/constants/002.html.ini +++ /dev/null @@ -1,3 +0,0 @@ -[002.html] - type: testharness - expected: CRASH diff --git a/tests/wpt/metadata/websockets/interfaces/WebSocket/constants/003.html.ini b/tests/wpt/metadata/websockets/interfaces/WebSocket/constants/003.html.ini deleted file mode 100644 index f2b01b122e4..00000000000 --- a/tests/wpt/metadata/websockets/interfaces/WebSocket/constants/003.html.ini +++ /dev/null @@ -1,3 +0,0 @@ -[003.html] - type: testharness - expected: CRASH diff --git a/tests/wpt/metadata/websockets/interfaces/WebSocket/constants/004.html.ini b/tests/wpt/metadata/websockets/interfaces/WebSocket/constants/004.html.ini deleted file mode 100644 index 58468cab4ee..00000000000 --- a/tests/wpt/metadata/websockets/interfaces/WebSocket/constants/004.html.ini +++ /dev/null @@ -1,3 +0,0 @@ -[004.html] - type: testharness - expected: CRASH diff --git a/tests/wpt/metadata/websockets/interfaces/WebSocket/events/001.html.ini b/tests/wpt/metadata/websockets/interfaces/WebSocket/events/001.html.ini index 67f5d9b0879..406e60696e7 100644 --- a/tests/wpt/metadata/websockets/interfaces/WebSocket/events/001.html.ini +++ b/tests/wpt/metadata/websockets/interfaces/WebSocket/events/001.html.ini @@ -1,3 +1,5 @@ [001.html] type: testharness - expected: CRASH + [WebSockets: getting on* 1] + expected: FAIL + diff --git a/tests/wpt/metadata/websockets/interfaces/WebSocket/events/002.html.ini b/tests/wpt/metadata/websockets/interfaces/WebSocket/events/002.html.ini deleted file mode 100644 index fe7c6057cbd..00000000000 --- a/tests/wpt/metadata/websockets/interfaces/WebSocket/events/002.html.ini +++ /dev/null @@ -1,3 +0,0 @@ -[002.html] - type: testharness - expected: CRASH diff --git a/tests/wpt/metadata/websockets/interfaces/WebSocket/events/003.html.ini b/tests/wpt/metadata/websockets/interfaces/WebSocket/events/003.html.ini deleted file mode 100644 index f2b01b122e4..00000000000 --- a/tests/wpt/metadata/websockets/interfaces/WebSocket/events/003.html.ini +++ /dev/null @@ -1,3 +0,0 @@ -[003.html] - type: testharness - expected: CRASH diff --git a/tests/wpt/metadata/websockets/interfaces/WebSocket/events/004.html.ini b/tests/wpt/metadata/websockets/interfaces/WebSocket/events/004.html.ini deleted file mode 100644 index 58468cab4ee..00000000000 --- a/tests/wpt/metadata/websockets/interfaces/WebSocket/events/004.html.ini +++ /dev/null @@ -1,3 +0,0 @@ -[004.html] - type: testharness - expected: CRASH diff --git a/tests/wpt/metadata/websockets/interfaces/WebSocket/events/006.html.ini b/tests/wpt/metadata/websockets/interfaces/WebSocket/events/006.html.ini index 016efd444be..1d8fe97b69b 100644 --- a/tests/wpt/metadata/websockets/interfaces/WebSocket/events/006.html.ini +++ b/tests/wpt/metadata/websockets/interfaces/WebSocket/events/006.html.ini @@ -1,3 +1,5 @@ [006.html] type: testharness - expected: CRASH + [WebSockets: 'on*' in ws] + expected: FAIL + diff --git a/tests/wpt/metadata/websockets/interfaces/WebSocket/events/007.html.ini b/tests/wpt/metadata/websockets/interfaces/WebSocket/events/007.html.ini index 323bf776b2e..dcdd17dea05 100644 --- a/tests/wpt/metadata/websockets/interfaces/WebSocket/events/007.html.ini +++ b/tests/wpt/metadata/websockets/interfaces/WebSocket/events/007.html.ini @@ -1,3 +1,5 @@ [007.html] type: testharness - expected: CRASH + [WebSockets: listening for events with onmessage] + expected: TIMEOUT + diff --git a/tests/wpt/metadata/websockets/interfaces/WebSocket/events/008.html.ini b/tests/wpt/metadata/websockets/interfaces/WebSocket/events/008.html.ini deleted file mode 100644 index dc8d6d123e8..00000000000 --- a/tests/wpt/metadata/websockets/interfaces/WebSocket/events/008.html.ini +++ /dev/null @@ -1,3 +0,0 @@ -[008.html] - type: testharness - expected: CRASH diff --git a/tests/wpt/metadata/websockets/interfaces/WebSocket/events/009.html.ini b/tests/wpt/metadata/websockets/interfaces/WebSocket/events/009.html.ini deleted file mode 100644 index b4f74907aa9..00000000000 --- a/tests/wpt/metadata/websockets/interfaces/WebSocket/events/009.html.ini +++ /dev/null @@ -1,3 +0,0 @@ -[009.html] - type: testharness - expected: CRASH diff --git a/tests/wpt/metadata/websockets/interfaces/WebSocket/readyState/001.html.ini b/tests/wpt/metadata/websockets/interfaces/WebSocket/readyState/001.html.ini deleted file mode 100644 index 67f5d9b0879..00000000000 --- a/tests/wpt/metadata/websockets/interfaces/WebSocket/readyState/001.html.ini +++ /dev/null @@ -1,3 +0,0 @@ -[001.html] - type: testharness - expected: CRASH diff --git a/tests/wpt/metadata/websockets/interfaces/WebSocket/readyState/002.html.ini b/tests/wpt/metadata/websockets/interfaces/WebSocket/readyState/002.html.ini deleted file mode 100644 index fe7c6057cbd..00000000000 --- a/tests/wpt/metadata/websockets/interfaces/WebSocket/readyState/002.html.ini +++ /dev/null @@ -1,3 +0,0 @@ -[002.html] - type: testharness - expected: CRASH diff --git a/tests/wpt/metadata/websockets/interfaces/WebSocket/send/002.html.ini b/tests/wpt/metadata/websockets/interfaces/WebSocket/send/002.html.ini deleted file mode 100644 index fe7c6057cbd..00000000000 --- a/tests/wpt/metadata/websockets/interfaces/WebSocket/send/002.html.ini +++ /dev/null @@ -1,3 +0,0 @@ -[002.html] - type: testharness - expected: CRASH diff --git a/tests/wpt/metadata/websockets/interfaces/WebSocket/url/001.html.ini b/tests/wpt/metadata/websockets/interfaces/WebSocket/url/001.html.ini deleted file mode 100644 index 67f5d9b0879..00000000000 --- a/tests/wpt/metadata/websockets/interfaces/WebSocket/url/001.html.ini +++ /dev/null @@ -1,3 +0,0 @@ -[001.html] - type: testharness - expected: CRASH diff --git a/tests/wpt/metadata/websockets/interfaces/WebSocket/url/002.html.ini b/tests/wpt/metadata/websockets/interfaces/WebSocket/url/002.html.ini deleted file mode 100644 index fe7c6057cbd..00000000000 --- a/tests/wpt/metadata/websockets/interfaces/WebSocket/url/002.html.ini +++ /dev/null @@ -1,3 +0,0 @@ -[002.html] - type: testharness - expected: CRASH diff --git a/tests/wpt/metadata/websockets/interfaces/WebSocket/url/003.html.ini b/tests/wpt/metadata/websockets/interfaces/WebSocket/url/003.html.ini deleted file mode 100644 index f2b01b122e4..00000000000 --- a/tests/wpt/metadata/websockets/interfaces/WebSocket/url/003.html.ini +++ /dev/null @@ -1,3 +0,0 @@ -[003.html] - type: testharness - expected: CRASH diff --git a/tests/wpt/metadata/websockets/interfaces/WebSocket/url/004.html.ini b/tests/wpt/metadata/websockets/interfaces/WebSocket/url/004.html.ini deleted file mode 100644 index 58468cab4ee..00000000000 --- a/tests/wpt/metadata/websockets/interfaces/WebSocket/url/004.html.ini +++ /dev/null @@ -1,3 +0,0 @@ -[004.html] - type: testharness - expected: CRASH diff --git a/tests/wpt/metadata/websockets/opening-handshake/001.html.ini b/tests/wpt/metadata/websockets/opening-handshake/001.html.ini index 67f5d9b0879..42dc79e1c4f 100644 --- a/tests/wpt/metadata/websockets/opening-handshake/001.html.ini +++ b/tests/wpt/metadata/websockets/opening-handshake/001.html.ini @@ -1,3 +1,5 @@ [001.html] type: testharness - expected: CRASH + [WebSockets: invalid handshake] + expected: FAIL + diff --git a/tests/wpt/metadata/websockets/security/001.html.ini b/tests/wpt/metadata/websockets/security/001.html.ini deleted file mode 100644 index 67f5d9b0879..00000000000 --- a/tests/wpt/metadata/websockets/security/001.html.ini +++ /dev/null @@ -1,3 +0,0 @@ -[001.html] - type: testharness - expected: CRASH |