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

Side by Side Diff: tests/standalone/io/web_socket_compression_test.dart

Issue 1584653008: Optimize Websocket compression for no context takeover requests (Closed) Base URL: https://github.com/dart-lang/sdk.git@master
Patch Set: Created 4 years, 11 months 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 | « sdk/lib/io/websocket_impl.dart ('k') | no next file » | 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 // VMOptions= 5 // VMOptions=
6 // VMOptions=--short_socket_read 6 // VMOptions=--short_socket_read
7 // VMOptions=--short_socket_write 7 // VMOptions=--short_socket_write
8 // VMOptions=--short_socket_read --short_socket_write 8 // VMOptions=--short_socket_read --short_socket_write
9 9
10 import "dart:async"; 10 import "dart:async";
(...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after
164 164
165 WebSocket.connect(url).then((websocket) { 165 WebSocket.connect(url).then((websocket) {
166 return websocket.listen((message) { 166 return websocket.listen((message) {
167 Expect.equals("Hello", message); 167 Expect.equals("Hello", message);
168 websocket.close(); 168 websocket.close();
169 }).asFuture(); 169 }).asFuture();
170 }).then((_) => server.close()); 170 }).then((_) => server.close());
171 }); 171 });
172 } 172 }
173 173
174 void testReturnHeaders(String headerValue, String expected) { 174 void testReturnHeaders(String headerValue, String expected, {
175 CompressionOptions serverCompression: CompressionOptions.DEFAULT}) {
175 asyncStart(); 176 asyncStart();
176 createServer().then((server) { 177 createServer().then((server) {
177 server.listen((request) { 178 server.listen((request) {
178 // Stuff 179 // Stuff
179 Expect.isTrue(WebSocketTransformer.isUpgradeRequest(request)); 180 Expect.isTrue(WebSocketTransformer.isUpgradeRequest(request));
180 WebSocketTransformer.upgrade(request).then((webSocket) { 181 WebSocketTransformer.upgrade(request, compression: serverCompression)
182 .then((webSocket) {
181 webSocket.listen((message) { 183 webSocket.listen((message) {
182 Expect.equals("Hello World", message); 184 Expect.equals("Hello World", message);
183 185
184 webSocket.add(message); 186 webSocket.add(message);
185 webSocket.close(); 187 webSocket.close();
186 }); 188 });
187 }); 189 });
188 }); 190 });
189 191
190 var url = '${secure ? "wss" : "ws"}://$HOST_NAME:${server.port}/'; 192 var url = '${secure ? "wss" : "ws"}://$HOST_NAME:${server.port}/';
(...skipping 18 matching lines...) Expand all
209 }).asFuture(); 211 }).asFuture();
210 websocket.add("Hello World"); 212 websocket.add("Hello World");
211 return future; 213 return future;
212 }).then((_) { 214 }).then((_) {
213 server.close(); 215 server.close();
214 asyncEnd(); 216 asyncEnd();
215 }); 217 });
216 }); // End createServer 218 }); // End createServer
217 } 219 }
218 220
221 void testClientRequestHeaders(CompressionOptions compression) {
222 asyncStart();
223 createServer().then((server) {
224 server.listen((request) {
225 var extensionHeader = request.headers.value('Sec-WebSocket-Extensions');
226 var hv = HeaderValue.parse(extensionHeader);
227 Expect.equals(compression.serverNoContextTakeover,
228 hv.parameters.containsKey('server_no_context_takeover'));
229 Expect.equals(compression.clientNoContextTakeover,
230 hv.parameters.containsKey('client_no_context_takeover'));
231 Expect.equals(compression.serverMaxWindowBits?.toString(),
232 hv.parameters['server_max_window_bits']);
233 Expect.equals(compression.clientMaxWindowBits?.toString(),
234 hv.parameters['client_max_window_bits']);
235
236 WebSocketTransformer.upgrade(request).then((webSocket) {
237 webSocket.listen((message) {
238 Expect.equals('Hello World', message);
239
240 webSocket.add(message);
241 webSocket.close();
242 });
243 });
244 });
245
246 var url = '${secure ? "wss" : "ws"}://$HOST_NAME:${server.port}/';
247
248 WebSocket.connect(url, compression: compression).then((websocket) {
249 var future = websocket.listen((message) {
250 Expect.equals('Hello World', message);
251 websocket.close();
252 }).asFuture();
253 websocket.add('Hello World');
Søren Gjesse 2016/01/18 07:36:00 With the different options of context take-over an
254 return future;
255 }).then((_) {
256 server.close();
257 asyncEnd();
258 });
259 });
260 }
261
219 void runTests() { 262 void runTests() {
220 // No compression or takeover 263 // No compression or takeover
221 testCompressionSupport(); 264 testCompressionSupport();
222 // compression no takeover 265 // compression no takeover
223 testCompressionSupport(server: true, client: true); 266 testCompressionSupport(server: true, client: true);
224 // compression and context takeover. 267 // compression and context takeover.
225 testCompressionSupport(server: true, client: true, contextTakeover: true); 268 testCompressionSupport(server: true, client: true, contextTakeover: true);
226 // Compression on client but not server. No take over 269 // Compression on client but not server. No take over
227 testCompressionSupport(client: true); 270 testCompressionSupport(client: true);
228 // Compression on server but not client. 271 // Compression on server but not client.
229 testCompressionSupport(server: true); 272 testCompressionSupport(server: true);
230 273
231 testCompressionHeaders(); 274 testCompressionHeaders();
232 // Chrome headers 275 // Chrome headers
233 testReturnHeaders('permessage-deflate; client_max_window_bits', 276 testReturnHeaders('permessage-deflate; client_max_window_bits',
234 "permessage-deflate; client_max_window_bits=15"); 277 "permessage-deflate; client_max_window_bits=15");
235 // Firefox headers 278 // Firefox headers
236 testReturnHeaders('permessage-deflate', 279 testReturnHeaders('permessage-deflate',
237 "permessage-deflate; client_max_window_bits=15"); 280 "permessage-deflate; client_max_window_bits=15");
238 // Ensure max_window_bits resize appropriately. 281 // Ensure max_window_bits resize appropriately.
239 testReturnHeaders('permessage-deflate; server_max_window_bits=10', 282 testReturnHeaders('permessage-deflate; server_max_window_bits=10',
240 "permessage-deflate;" 283 "permessage-deflate;"
241 " server_max_window_bits=10;" 284 " server_max_window_bits=10;"
242 " client_max_window_bits=10"); 285 " client_max_window_bits=10");
286 // Don't provider context takeover if requested but not enabled.
287 // Default is not enabled.
288 testReturnHeaders('permessage-deflate; client_max_window_bits;'
289 'client_no_context_takeover',
290 'permessage-deflate; client_max_window_bits=15');
291 // Enable context Takeover and provide if requested.
292 var compression = new CompressionOptions(clientNoContextTakeover: true,
293 serverNoContextTakeover: true);
294 testReturnHeaders('permessage-deflate; client_max_window_bits; '
295 'client_no_context_takeover',
296 'permessage-deflate; client_no_context_takeover; '
297 'client_max_window_bits=15',
298 serverCompression: compression);
299 // Enable context takeover and don't provide if not requested
300 compression = new CompressionOptions(clientNoContextTakeover: true,
301 serverNoContextTakeover: true);
302 testReturnHeaders('permessage-deflate; client_max_window_bits; ',
303 'permessage-deflate; client_max_window_bits=15',
304 serverCompression: compression);
305
306 compression = CompressionOptions.DEFAULT;
307 testClientRequestHeaders(compression);
308 compression = new CompressionOptions(clientNoContextTakeover: true,
309 serverNoContextTakeover: true);
310 testClientRequestHeaders(compression);
311 compression = new CompressionOptions(clientNoContextTakeover: true,
312 serverNoContextTakeover: true,
313 clientMaxWindowBits: 8,
314 serverMaxWindowBits: 8);
315 testClientRequestHeaders(compression);
243 } 316 }
244 } 317 }
245 318
246 main() { 319 main() {
247 new SecurityConfiguration(secure: false).runTests(); 320 new SecurityConfiguration(secure: false).runTests();
248 // TODO(whesse): Make WebSocket.connect() take an optional context: parameter. 321 // TODO(whesse): Make WebSocket.connect() take an optional context: parameter.
249 // new SecurityConfiguration(secure: true).runTests(); 322 // new SecurityConfiguration(secure: true).runTests();
250 } 323 }
OLDNEW
« no previous file with comments | « sdk/lib/io/websocket_impl.dart ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698