aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom/websocket.rs
diff options
context:
space:
mode:
authorYanir Seroussi <yanir.seroussi@gmail.com>2015-11-27 16:52:02 +1100
committerYanir Seroussi <yanir.seroussi@gmail.com>2015-11-30 11:20:41 +1100
commitad9accf8e729b1f58a9c6f9a5a612c147c256f04 (patch)
treeb7df82d20217a0b1f097e06b4c690fb5c165123c /components/script/dom/websocket.rs
parentbc618b0d535e0e67a7ea845c026678113f000d64 (diff)
downloadservo-ad9accf8e729b1f58a9c6f9a5a612c147c256f04.tar.gz
servo-ad9accf8e729b1f58a9c6f9a5a612c147c256f04.zip
Implement unspecified websocket close code (fixes issue #8158)
Diffstat (limited to 'components/script/dom/websocket.rs')
-rw-r--r--components/script/dom/websocket.rs26
1 files changed, 21 insertions, 5 deletions
diff --git a/components/script/dom/websocket.rs b/components/script/dom/websocket.rs
index d96ee00311d..59763c44a83 100644
--- a/components/script/dom/websocket.rs
+++ b/components/script/dom/websocket.rs
@@ -126,6 +126,24 @@ const BLOCKED_PORTS_LIST: &'static [u16] = &[
6000, // x11
];
+// Close codes defined in https://tools.ietf.org/html/rfc6455#section-7.4.1
+// Names are from https://github.com/mozilla/gecko-dev/blob/master/netwerk/protocol/websocket/nsIWebSocketChannel.idl
+#[allow(dead_code)]
+mod close_code {
+ pub const NORMAL: u16 = 1000;
+ pub const GOING_AWAY: u16 = 1001;
+ pub const PROTOCOL_ERROR: u16 = 1002;
+ pub const UNSUPPORTED_DATATYPE: u16 = 1003;
+ pub const NO_STATUS: u16 = 1005;
+ pub const ABNORMAL: u16 = 1006;
+ pub const INVALID_PAYLOAD: u16 = 1007;
+ pub const POLICY_VIOLATION: u16 = 1008;
+ pub const TOO_LARGE: u16 = 1009;
+ pub const EXTENSION_MISSING: u16 = 1010;
+ pub const INTERNAL_ERROR: u16 = 1011;
+ pub const TLS_FAILED: u16 = 1015;
+}
+
#[dom_struct]
pub struct WebSocket {
eventtarget: EventTarget,
@@ -426,8 +444,8 @@ impl WebSocketMethods for WebSocket {
if let Some(code) = code {
- //Check code is NOT 1000 NOR in the range of 3000-4999 (inclusive)
- if code != 1000 && (code < 3000 || code > 4999) {
+ //Fail if the supplied code isn't normal and isn't reserved for libraries, frameworks, and applications
+ if code != close_code::NORMAL && (code < 3000 || code > 4999) {
return Err(Error::InvalidAccess);
}
}
@@ -450,9 +468,7 @@ impl WebSocketMethods for WebSocket {
WebSocketRequestState::Open => {
//Closing handshake not started - still in open
//Start the closing by setting the code and reason if they exist
- if let Some(code) = code {
- self.code.set(code);
- }
+ self.code.set(code.unwrap_or(close_code::NO_STATUS));
if let Some(reason) = reason {
*self.reason.borrow_mut() = reason.0;
}