Index: sdk/lib/io/websocket.dart |
diff --git a/sdk/lib/io/websocket.dart b/sdk/lib/io/websocket.dart |
index 5170bde89e6e45766c476c44122db6333be93f6f..edb5b6d1ba00e6453740ce5e73d6cf77e725acf0 100644 |
--- a/sdk/lib/io/websocket.dart |
+++ b/sdk/lib/io/websocket.dart |
@@ -72,19 +72,23 @@ class CompressionOptions { |
const CompressionOptions( |
{this.clientNoContextTakeover: false, |
this.serverNoContextTakeover: false, |
- this.clientMaxWindowBits: _WebSocketImpl.DEFAULT_WINDOW_BITS, |
- this.serverMaxWindowBits: _WebSocketImpl.DEFAULT_WINDOW_BITS, |
+ this.clientMaxWindowBits, |
+ this.serverMaxWindowBits, |
this.enabled: true}); |
/// Parses list of requested server headers to return server compression |
/// response headers. Uses [serverMaxWindowBits] value if set, otherwise will |
/// attempt to use value from headers. Defaults to |
- /// [WebSocket.DEFAULT_WINDOW_BITS] |
- List _createServerResponseHeader(HeaderValue requested) { |
- var info = new List(2); |
+ /// [WebSocket.DEFAULT_WINDOW_BITS]. Returns a [_CompressionMaxWindowBits] |
+ /// object which contains the response headers and negotiated max window bits. |
+ _CompressionMaxWindowBits _createServerResponseHeader(HeaderValue requested) { |
+ var info = new _CompressionMaxWindowBits(); |
int mwb; |
- var part = requested.parameters[_serverMaxWindowBits]; |
+ String part; |
+ if (requested?.parameters != null) { |
+ part = requested.parameters[_serverMaxWindowBits]; |
+ } |
if (part != null) { |
if (part.length >= 2 && part.startsWith('0')) { |
throw new ArgumentError("Illegal 0 padding on value."); |
@@ -93,66 +97,65 @@ class CompressionOptions { |
? int.parse(part, |
onError: (source) => _WebSocketImpl.DEFAULT_WINDOW_BITS) |
: serverMaxWindowBits; |
- info[0] = "; server_max_window_bits=${mwb}"; |
- info[1] = mwb; |
+ info.headerValue = "; server_max_window_bits=${mwb}"; |
+ info.maxWindowBits = mwb; |
} |
} else { |
- info[1] = _WebSocketImpl.DEFAULT_WINDOW_BITS; |
+ info.headerValue = ""; |
+ info.maxWindowBits = _WebSocketImpl.DEFAULT_WINDOW_BITS; |
} |
return info; |
} |
/// Returns default values for client compression request headers. |
- List _createClientRequestHeader(HeaderValue requested) { |
- var info = new List(2); |
+ String _createClientRequestHeader(HeaderValue requested, int size) { |
+ var info = ""; |
- info[1] = _WebSocketImpl.DEFAULT_WINDOW_BITS; |
- if (requested != null && |
- requested.parameters[_clientMaxWindowBits] != null) { |
- info[0] = "; client_max_window_bits=${info[1]}"; |
+ // If responding to a valid request, specify size |
+ if (requested != null) { |
+ info = "; client_max_window_bits=$size"; |
} else { |
- info[0] = "; client_max_window_bits"; |
+ // Client request. Specify default |
+ info = "; client_max_window_bits"; |
} |
return info; |
} |
/// Create a Compression Header. If [requested] is null or contains |
- /// client request headers, returns Client compression request headers. |
+ /// client request headers, returns Client compression request headers with |
+ /// default settings for `client_max_window_bits` header value. |
/// If [requested] contains server response headers this method returns |
- /// a Server compression response header. |
- List _createHeader([HeaderValue requested]) { |
+ /// a Server compression response header negotiating the max window bits |
+ /// for both client and server as requested server_max_window_bits value. |
+ /// This method returns a [_CompressionMaxWindowBits] object with the |
+ /// response headers and negotiated maxWindowBits value. |
+ _CompressionMaxWindowBits _createHeader([HeaderValue requested]) { |
+ var info = new _CompressionMaxWindowBits("", 0); |
if (!enabled) { |
- return ["", 0]; |
+ return info; |
} |
- var info = new List(2); |
- var header = _WebSocketImpl.PER_MESSAGE_DEFLATE; |
+ info.headerValue = _WebSocketImpl.PER_MESSAGE_DEFLATE; |
if (clientNoContextTakeover && |
(requested != null && |
requested.parameters.containsKey(_clientNoContextTakeover))) { |
- header += "; client_no_context_takeover"; |
+ info.headerValue += "; client_no_context_takeover"; |
} |
if (serverNoContextTakeover && |
(requested != null && |
requested.parameters.containsKey(_serverNoContextTakeover))) { |
- header += "; server_no_context_takeover"; |
+ info.headerValue += "; server_no_context_takeover"; |
} |
- if (requested == null || |
- requested.parameters.containsKey(_clientMaxWindowBits)) { |
- var clientList = _createClientRequestHeader(requested); |
- header += clientList[0]; |
- info[1] = clientList[1]; |
- } else { |
- var headerList = _createServerResponseHeader(requested); |
- header += headerList[0]; |
- info[1] = headerList[1]; |
- } |
+ var headerList = _createServerResponseHeader(requested); |
+ info.headerValue += headerList.headerValue; |
+ info.maxWindowBits = headerList.maxWindowBits; |
- info[0] = header; |
+ info.headerValue += |
+ _createClientRequestHeader(requested, info.maxWindowBits); |
return info; |
} |