Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(162)

Side by Side Diff: sdk/lib/io/websocket.dart

Issue 1437623002: Ensure proper response to chrome client_max_window_bits (Closed) Base URL: https://github.com/dart-lang/sdk.git@master
Patch Set: Always send client_max_window_bits on response Created 5 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | sdk/lib/io/websocket_impl.dart » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 part of dart.io; 5 part of dart.io;
6 6
7 /** 7 /**
8 * WebSocket status codes used when closing a WebSocket connection. 8 * WebSocket status codes used when closing a WebSocket connection.
9 */ 9 */
10 abstract class WebSocketStatus { 10 abstract class WebSocketStatus {
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
72 const CompressionOptions( 72 const CompressionOptions(
73 {this.clientNoContextTakeover: false, 73 {this.clientNoContextTakeover: false,
74 this.serverNoContextTakeover: false, 74 this.serverNoContextTakeover: false,
75 this.clientMaxWindowBits: _WebSocketImpl.DEFAULT_WINDOW_BITS, 75 this.clientMaxWindowBits: _WebSocketImpl.DEFAULT_WINDOW_BITS,
76 this.serverMaxWindowBits: _WebSocketImpl.DEFAULT_WINDOW_BITS, 76 this.serverMaxWindowBits: _WebSocketImpl.DEFAULT_WINDOW_BITS,
77 this.enabled: true}); 77 this.enabled: true});
78 78
79 /// Parses list of requested server headers to return server compression 79 /// Parses list of requested server headers to return server compression
80 /// response headers. Uses [serverMaxWindowBits] value if set, otherwise will 80 /// response headers. Uses [serverMaxWindowBits] value if set, otherwise will
81 /// attempt to use value from headers. Defaults to 81 /// attempt to use value from headers. Defaults to
82 /// [WebSocket.DEFAULT_WINDOW_BITS] 82 /// [WebSocket.DEFAULT_WINDOW_BITS]
Søren Gjesse 2015/11/11 13:31:08 Please update the documentation to explain the two
butlermatt 2015/11/11 18:26:30 Done.
83 List _createServerResponseHeader(HeaderValue requested) { 83 List _createServerResponseHeader(HeaderValue requested) {
84 var info = new List(2); 84 var info = new List(2);
85 85
86 int mwb; 86 int mwb;
87 var part = requested.parameters[_serverMaxWindowBits]; 87 String part;
88 if (requested?.parameters != null) {
89 part = requested.parameters[_serverMaxWindowBits];
90 }
88 if (part != null) { 91 if (part != null) {
89 if (part.length >= 2 && part.startsWith('0')) { 92 if (part.length >= 2 && part.startsWith('0')) {
90 throw new ArgumentError("Illegal 0 padding on value."); 93 throw new ArgumentError("Illegal 0 padding on value.");
91 } else { 94 } else {
92 mwb = serverMaxWindowBits == null 95 mwb = serverMaxWindowBits == null
93 ? int.parse(part, 96 ? int.parse(part,
94 onError: (source) => _WebSocketImpl.DEFAULT_WINDOW_BITS) 97 onError: (source) => _WebSocketImpl.DEFAULT_WINDOW_BITS)
95 : serverMaxWindowBits; 98 : serverMaxWindowBits;
96 info[0] = "; server_max_window_bits=${mwb}"; 99 info[0] = "; server_max_window_bits=${mwb}";
97 info[1] = mwb; 100 info[1] = mwb;
98 } 101 }
99 } else { 102 } else {
103 info[0] = "";
100 info[1] = _WebSocketImpl.DEFAULT_WINDOW_BITS; 104 info[1] = _WebSocketImpl.DEFAULT_WINDOW_BITS;
101 } 105 }
102 return info; 106 return info;
103 } 107 }
104 108
105 /// Returns default values for client compression request headers. 109 /// Returns default values for client compression request headers.
106 List _createClientRequestHeader(HeaderValue requested) { 110 List _createClientRequestHeader(HeaderValue requested, int size) {
Søren Gjesse 2015/11/11 13:31:08 This is no longer returning a List.
butlermatt 2015/11/11 18:26:30 Done.
107 var info = new List(2); 111 var info = "";
108 112
109 info[1] = _WebSocketImpl.DEFAULT_WINDOW_BITS; 113 // If responding to a valid request, specify size
110 if (requested != null && 114 if (requested != null) {
111 requested.parameters[_clientMaxWindowBits] != null) { 115 info = "; client_max_window_bits=$size";
112 info[0] = "; client_max_window_bits=${info[1]}";
113 } else { 116 } else {
114 info[0] = "; client_max_window_bits"; 117 // Client request. Specify default
118 info = "; client_max_window_bits";
115 } 119 }
116 120
117 return info; 121 return info;
118 } 122 }
119 123
120 /// Create a Compression Header. If [requested] is null or contains 124 /// Create a Compression Header. If [requested] is null or contains
121 /// client request headers, returns Client compression request headers. 125 /// client request headers, returns Client compression request headers.
122 /// If [requested] contains server response headers this method returns 126 /// If [requested] contains server response headers this method returns
123 /// a Server compression response header. 127 /// a Server compression response header.
124 List _createHeader([HeaderValue requested]) { 128 List _createHeader([HeaderValue requested]) {
Søren Gjesse 2015/11/11 13:31:08 See above.
butlermatt 2015/11/11 18:26:30 Done.
125 if (!enabled) { 129 if (!enabled) {
126 return ["", 0]; 130 return ["", 0];
127 } 131 }
128 132
129 var info = new List(2); 133 var info = new List(2);
130 var header = _WebSocketImpl.PER_MESSAGE_DEFLATE; 134 var header = _WebSocketImpl.PER_MESSAGE_DEFLATE;
131 135
132 if (clientNoContextTakeover && 136 if (clientNoContextTakeover &&
133 (requested != null && 137 (requested != null &&
134 requested.parameters.containsKey(_clientNoContextTakeover))) { 138 requested.parameters.containsKey(_clientNoContextTakeover))) {
135 header += "; client_no_context_takeover"; 139 header += "; client_no_context_takeover";
136 } 140 }
137 141
138 if (serverNoContextTakeover && 142 if (serverNoContextTakeover &&
139 (requested != null && 143 (requested != null &&
140 requested.parameters.containsKey(_serverNoContextTakeover))) { 144 requested.parameters.containsKey(_serverNoContextTakeover))) {
141 header += "; server_no_context_takeover"; 145 header += "; server_no_context_takeover";
142 } 146 }
143 147
144 if (requested == null || 148 var headerList = _createServerResponseHeader(requested);
145 requested.parameters.containsKey(_clientMaxWindowBits)) { 149 header += headerList[0];
146 var clientList = _createClientRequestHeader(requested); 150 info[1] = headerList[1];
147 header += clientList[0]; 151
148 info[1] = clientList[1]; 152 var clientList = _createClientRequestHeader(requested, info[1]);
149 } else { 153 header += clientList;
150 var headerList = _createServerResponseHeader(requested);
151 header += headerList[0];
152 info[1] = headerList[1];
153 }
154 154
155 info[0] = header; 155 info[0] = header;
156
157 return info; 156 return info;
158 } 157 }
159 } 158 }
160 159
161 /** 160 /**
162 * The [WebSocketTransformer] provides the ability to upgrade a 161 * The [WebSocketTransformer] provides the ability to upgrade a
163 * [HttpRequest] to a [WebSocket] connection. It supports both 162 * [HttpRequest] to a [WebSocket] connection. It supports both
164 * upgrading a single [HttpRequest] and upgrading a stream of 163 * upgrading a single [HttpRequest] and upgrading a stream of
165 * [HttpRequest]s. 164 * [HttpRequest]s.
166 * 165 *
(...skipping 224 matching lines...) Expand 10 before | Expand all | Expand 10 after
391 Future addStream(Stream stream); 390 Future addStream(Stream stream);
392 } 391 }
393 392
394 class WebSocketException implements IOException { 393 class WebSocketException implements IOException {
395 final String message; 394 final String message;
396 395
397 const WebSocketException([this.message = ""]); 396 const WebSocketException([this.message = ""]);
398 397
399 String toString() => "WebSocketException: $message"; 398 String toString() => "WebSocketException: $message";
400 } 399 }
OLDNEW
« no previous file with comments | « no previous file | sdk/lib/io/websocket_impl.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698