aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--components/net/http_loader.rs2
-rw-r--r--components/net/resource_thread.rs2
-rw-r--r--components/net/websocket_loader.rs14
-rw-r--r--components/script/dom/websocket.rs12
-rw-r--r--tests/wpt/metadata/websockets/cookies/001.html.ini5
-rw-r--r--tests/wpt/metadata/websockets/cookies/002.html.ini5
-rw-r--r--tests/wpt/metadata/websockets/cookies/003.html.ini5
-rw-r--r--tests/wpt/metadata/websockets/cookies/005.html.ini5
-rw-r--r--tests/wpt/metadata/websockets/cookies/007.html.ini5
9 files changed, 23 insertions, 32 deletions
diff --git a/components/net/http_loader.rs b/components/net/http_loader.rs
index 64c732446db..23d3af84337 100644
--- a/components/net/http_loader.rs
+++ b/components/net/http_loader.rs
@@ -349,7 +349,7 @@ fn set_default_accept(headers: &mut Headers) {
}
}
-fn set_request_cookies(url: Url, headers: &mut Headers, cookie_jar: &Arc<RwLock<CookieStorage>>) {
+pub fn set_request_cookies(url: Url, headers: &mut Headers, cookie_jar: &Arc<RwLock<CookieStorage>>) {
let mut cookie_jar = cookie_jar.write().unwrap();
if let Some(cookie_list) = cookie_jar.cookies_for_url(&url, CookieSource::HTTP) {
let mut v = Vec::new();
diff --git a/components/net/resource_thread.rs b/components/net/resource_thread.rs
index 37a63326173..89e63e14f79 100644
--- a/components/net/resource_thread.rs
+++ b/components/net/resource_thread.rs
@@ -362,6 +362,6 @@ impl ResourceManager {
fn websocket_connect(&self,
connect: WebSocketCommunicate,
connect_data: WebSocketConnectData) {
- websocket_loader::init(connect, connect_data);
+ websocket_loader::init(connect, connect_data, self.cookie_storage.clone());
}
}
diff --git a/components/net/websocket_loader.rs b/components/net/websocket_loader.rs
index e25d7e7389f..52a9bb6cff3 100644
--- a/components/net/websocket_loader.rs
+++ b/components/net/websocket_loader.rs
@@ -2,13 +2,15 @@
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+use cookie_storage::CookieStorage;
+use http_loader;
use hyper::header::Host;
use net_traits::MessageData;
use net_traits::hosts::replace_hosts;
use net_traits::unwrap_websocket_protocol;
use net_traits::{WebSocketCommunicate, WebSocketConnectData, WebSocketDomAction, WebSocketNetworkEvent};
use std::ascii::AsciiExt;
-use std::sync::{Arc, Mutex};
+use std::sync::{Arc, Mutex, RwLock};
use std::thread;
use util::thread::spawn_named;
use websocket::client::receiver::Receiver;
@@ -25,7 +27,8 @@ use websocket::{Client, Message};
/// *Establish a WebSocket Connection* as defined in RFC 6455.
fn establish_a_websocket_connection(resource_url: &Url, net_url: (Host, String, bool),
- origin: String, protocols: Vec<String>)
+ origin: String, protocols: Vec<String>,
+ cookie_jar: Arc<RwLock<CookieStorage>>)
-> WebSocketResult<(Headers, Sender<WebSocketStream>, Receiver<WebSocketStream>)> {
let host = Host {
@@ -40,6 +43,8 @@ fn establish_a_websocket_connection(resource_url: &Url, net_url: (Host, String,
request.headers.set(WebSocketProtocol(protocols.clone()));
};
+ http_loader::set_request_cookies(resource_url.clone(), &mut request.headers, &cookie_jar);
+
let response = try!(request.send());
try!(response.validate());
@@ -58,7 +63,7 @@ fn establish_a_websocket_connection(resource_url: &Url, net_url: (Host, String,
}
-pub fn init(connect: WebSocketCommunicate, connect_data: WebSocketConnectData) {
+pub fn init(connect: WebSocketCommunicate, connect_data: WebSocketConnectData, cookie_jar: Arc<RwLock<CookieStorage>>) {
spawn_named(format!("WebSocket connection to {}", connect_data.resource_url), move || {
// Step 8: Protocols.
@@ -78,7 +83,8 @@ pub fn init(connect: WebSocketCommunicate, connect_data: WebSocketConnectData) {
let channel = establish_a_websocket_connection(&connect_data.resource_url,
net_url,
connect_data.origin,
- connect_data.protocols.clone());
+ connect_data.protocols.clone(),
+ cookie_jar);
let (_, ws_sender, mut receiver) = match channel {
Ok(channel) => {
let _ = connect.event_sender.send(WebSocketNetworkEvent::ConnectionEstablished(channel.0.clone(),
diff --git a/components/script/dom/websocket.rs b/components/script/dom/websocket.rs
index c8544698ecb..d87374e33f8 100644
--- a/components/script/dom/websocket.rs
+++ b/components/script/dom/websocket.rs
@@ -29,7 +29,8 @@ use js::jsapi::{JSAutoCompartment, JSAutoRequest, RootedValue};
use js::jsapi::{JS_GetArrayBufferData, JS_NewArrayBuffer};
use js::jsval::UndefinedValue;
use libc::{uint32_t, uint8_t};
-use net_traits::ControlMsg::WebsocketConnect;
+use net_traits::ControlMsg::{WebsocketConnect, SetCookiesForUrl};
+use net_traits::CookieSource::HTTP;
use net_traits::MessageData;
use net_traits::hosts::replace_hosts;
use net_traits::unwrap_websocket_protocol;
@@ -485,6 +486,15 @@ impl Runnable for ConnectionEstablishedTask {
};
// Step 5: Cookies.
+ if let Some(cookies) = self.headers.get_raw("set-cookie") {
+ for cookie in cookies.iter() {
+ if let Ok(cookie_value) = String::from_utf8(cookie.clone()) {
+ let _ = ws.global().r().resource_thread().send(SetCookiesForUrl(ws.url.clone(),
+ cookie_value,
+ HTTP));
+ }
+ }
+ }
// Step 6.
ws.upcast().fire_simple_event("open", global.r());
diff --git a/tests/wpt/metadata/websockets/cookies/001.html.ini b/tests/wpt/metadata/websockets/cookies/001.html.ini
deleted file mode 100644
index ab2692e0332..00000000000
--- a/tests/wpt/metadata/websockets/cookies/001.html.ini
+++ /dev/null
@@ -1,5 +0,0 @@
-[001.html]
- type: testharness
- [WebSockets: Cookie in request]
- expected: FAIL
-
diff --git a/tests/wpt/metadata/websockets/cookies/002.html.ini b/tests/wpt/metadata/websockets/cookies/002.html.ini
deleted file mode 100644
index a5cc7f98afa..00000000000
--- a/tests/wpt/metadata/websockets/cookies/002.html.ini
+++ /dev/null
@@ -1,5 +0,0 @@
-[002.html]
- type: testharness
- [WebSockets: Set-Cookie in response]
- expected: FAIL
-
diff --git a/tests/wpt/metadata/websockets/cookies/003.html.ini b/tests/wpt/metadata/websockets/cookies/003.html.ini
deleted file mode 100644
index 5b9a20aa236..00000000000
--- a/tests/wpt/metadata/websockets/cookies/003.html.ini
+++ /dev/null
@@ -1,5 +0,0 @@
-[003.html]
- type: testharness
- [WebSockets: sending HttpOnly cookies in ws request]
- expected: FAIL
-
diff --git a/tests/wpt/metadata/websockets/cookies/005.html.ini b/tests/wpt/metadata/websockets/cookies/005.html.ini
deleted file mode 100644
index afb9fd5f1fd..00000000000
--- a/tests/wpt/metadata/websockets/cookies/005.html.ini
+++ /dev/null
@@ -1,5 +0,0 @@
-[005.html]
- type: testharness
- [WebSockets: setting HttpOnly cookies in ws response, checking ws request]
- expected: FAIL
-
diff --git a/tests/wpt/metadata/websockets/cookies/007.html.ini b/tests/wpt/metadata/websockets/cookies/007.html.ini
deleted file mode 100644
index 437c6b99b43..00000000000
--- a/tests/wpt/metadata/websockets/cookies/007.html.ini
+++ /dev/null
@@ -1,5 +0,0 @@
-[007.html]
- type: testharness
- [WebSockets: when to process set-cookie fields in ws response]
- expected: FAIL
-