diff options
author | Yanir Seroussi <yanir.seroussi@gmail.com> | 2015-11-27 16:52:02 +1100 |
---|---|---|
committer | Yanir Seroussi <yanir.seroussi@gmail.com> | 2015-11-30 11:20:41 +1100 |
commit | ad9accf8e729b1f58a9c6f9a5a612c147c256f04 (patch) | |
tree | b7df82d20217a0b1f097e06b4c690fb5c165123c /components/script/dom/websocket.rs | |
parent | bc618b0d535e0e67a7ea845c026678113f000d64 (diff) | |
download | servo-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.rs | 26 |
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; } |