| OLD | NEW |
| 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 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 123 }).asFuture(); | 123 }).asFuture(); |
| 124 websocket.add("Hello World"); | 124 websocket.add("Hello World"); |
| 125 return future; | 125 return future; |
| 126 }).then((_) { | 126 }).then((_) { |
| 127 server.close(); | 127 server.close(); |
| 128 asyncEnd(); | 128 asyncEnd(); |
| 129 }); | 129 }); |
| 130 }); | 130 }); |
| 131 } | 131 } |
| 132 | 132 |
| 133 void testContextSupport({CompressionOptions serverOpts, |
| 134 CompressionOptions clientOpts, |
| 135 int messages}) { |
| 136 asyncStart(); |
| 137 |
| 138 createServer().then((server) { |
| 139 server.listen((request) { |
| 140 Expect.isTrue(WebSocketTransformer.isUpgradeRequest(request)); |
| 141 WebSocketTransformer.upgrade(request, compression: serverOpts) |
| 142 .then((webSocket) { |
| 143 webSocket.listen((message) { |
| 144 Expect.equals("Hello World", message); |
| 145 webSocket.add(message); |
| 146 }); |
| 147 }); |
| 148 }); |
| 149 |
| 150 var url = '${secure ? "wss" : "ws"}://$HOST_NAME:${server.port}/'; |
| 151 WebSocket.connect(url, compression: clientOpts).then((websocket) { |
| 152 var i = 1; |
| 153 websocket.listen((message) { |
| 154 Expect.equals("Hello World", message); |
| 155 if (i == messages) { |
| 156 websocket.close(); |
| 157 return; |
| 158 } |
| 159 websocket.add("Hello World"); |
| 160 i++; |
| 161 }, onDone: () { |
| 162 server.close(); |
| 163 asyncEnd(); |
| 164 }); |
| 165 websocket.add("Hello World"); |
| 166 }); |
| 167 }); |
| 168 } |
| 169 |
| 133 void testCompressionHeaders() { | 170 void testCompressionHeaders() { |
| 134 asyncStart(); | 171 asyncStart(); |
| 135 createServer().then((server) { | 172 createServer().then((server) { |
| 136 server.listen((request) { | 173 server.listen((request) { |
| 137 Expect.equals('Upgrade', request.headers.value(HttpHeaders.CONNECTION)); | 174 Expect.equals('Upgrade', request.headers.value(HttpHeaders.CONNECTION)); |
| 138 Expect.equals('websocket', request.headers.value(HttpHeaders.UPGRADE)); | 175 Expect.equals('websocket', request.headers.value(HttpHeaders.UPGRADE)); |
| 139 | 176 |
| 140 var key = request.headers.value('Sec-WebSocket-Key'); | 177 var key = request.headers.value('Sec-WebSocket-Key'); |
| 141 var sha1 = new SHA1()..add("$key$WEB_SOCKET_GUID".codeUnits); | 178 var sha1 = new SHA1()..add("$key$WEB_SOCKET_GUID".codeUnits); |
| 142 var accept = CryptoUtils.bytesToBase64(sha1.close()); | 179 var accept = CryptoUtils.bytesToBase64(sha1.close()); |
| (...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 264 testCompressionSupport(); | 301 testCompressionSupport(); |
| 265 // compression no takeover | 302 // compression no takeover |
| 266 testCompressionSupport(server: true, client: true); | 303 testCompressionSupport(server: true, client: true); |
| 267 // compression and context takeover. | 304 // compression and context takeover. |
| 268 testCompressionSupport(server: true, client: true, contextTakeover: true); | 305 testCompressionSupport(server: true, client: true, contextTakeover: true); |
| 269 // Compression on client but not server. No take over | 306 // Compression on client but not server. No take over |
| 270 testCompressionSupport(client: true); | 307 testCompressionSupport(client: true); |
| 271 // Compression on server but not client. | 308 // Compression on server but not client. |
| 272 testCompressionSupport(server: true); | 309 testCompressionSupport(server: true); |
| 273 | 310 |
| 311 // Test Multiple messages with various context takeover configurations. |
| 312 // no context takeover on the server. |
| 313 var serverComp = new CompressionOptions(serverNoContextTakeover: true); |
| 314 testContextSupport(serverOpts: serverComp, |
| 315 clientOpts: serverComp, |
| 316 messages: 5); |
| 317 // no contexttakeover on the client. |
| 318 var clientComp = new CompressionOptions(clientNoContextTakeover: true); |
| 319 testContextSupport(serverOpts: clientComp, |
| 320 clientOpts: clientComp, |
| 321 messages: 5); |
| 322 // no context takeover enabled for both. |
| 323 var compression = new CompressionOptions(serverNoContextTakeover: true, |
| 324 clientNoContextTakeover: true); |
| 325 testContextSupport(serverOpts: compression, |
| 326 clientOpts: compression, |
| 327 messages: 5); |
| 328 // no context take over for opposing configurations. |
| 329 testContextSupport(serverOpts: serverComp, |
| 330 clientOpts: clientComp, |
| 331 messages: 5); |
| 332 testContextSupport(serverOpts: clientComp, |
| 333 clientOpts: serverComp, |
| 334 messages: 5); |
| 335 |
| 274 testCompressionHeaders(); | 336 testCompressionHeaders(); |
| 275 // Chrome headers | 337 // Chrome headers |
| 276 testReturnHeaders('permessage-deflate; client_max_window_bits', | 338 testReturnHeaders('permessage-deflate; client_max_window_bits', |
| 277 "permessage-deflate; client_max_window_bits=15"); | 339 "permessage-deflate; client_max_window_bits=15"); |
| 278 // Firefox headers | 340 // Firefox headers |
| 279 testReturnHeaders('permessage-deflate', | 341 testReturnHeaders('permessage-deflate', |
| 280 "permessage-deflate; client_max_window_bits=15"); | 342 "permessage-deflate; client_max_window_bits=15"); |
| 281 // Ensure max_window_bits resize appropriately. | 343 // Ensure max_window_bits resize appropriately. |
| 282 testReturnHeaders('permessage-deflate; server_max_window_bits=10', | 344 testReturnHeaders('permessage-deflate; server_max_window_bits=10', |
| 283 "permessage-deflate;" | 345 "permessage-deflate;" |
| 284 " server_max_window_bits=10;" | 346 " server_max_window_bits=10;" |
| 285 " client_max_window_bits=10"); | 347 " client_max_window_bits=10"); |
| 286 // Don't provider context takeover if requested but not enabled. | 348 // Don't provider context takeover if requested but not enabled. |
| 287 // Default is not enabled. | 349 // Default is not enabled. |
| 288 testReturnHeaders('permessage-deflate; client_max_window_bits;' | 350 testReturnHeaders('permessage-deflate; client_max_window_bits;' |
| 289 'client_no_context_takeover', | 351 'client_no_context_takeover', |
| 290 'permessage-deflate; client_max_window_bits=15'); | 352 'permessage-deflate; client_max_window_bits=15'); |
| 291 // Enable context Takeover and provide if requested. | 353 // Enable context Takeover and provide if requested. |
| 292 var compression = new CompressionOptions(clientNoContextTakeover: true, | 354 compression = new CompressionOptions(clientNoContextTakeover: true, |
| 293 serverNoContextTakeover: true); | 355 serverNoContextTakeover: true); |
| 294 testReturnHeaders('permessage-deflate; client_max_window_bits; ' | 356 testReturnHeaders('permessage-deflate; client_max_window_bits; ' |
| 295 'client_no_context_takeover', | 357 'client_no_context_takeover', |
| 296 'permessage-deflate; client_no_context_takeover; ' | 358 'permessage-deflate; client_no_context_takeover; ' |
| 297 'client_max_window_bits=15', | 359 'client_max_window_bits=15', |
| 298 serverCompression: compression); | 360 serverCompression: compression); |
| 299 // Enable context takeover and don't provide if not requested | 361 // Enable context takeover and don't provide if not requested |
| 300 compression = new CompressionOptions(clientNoContextTakeover: true, | 362 compression = new CompressionOptions(clientNoContextTakeover: true, |
| 301 serverNoContextTakeover: true); | 363 serverNoContextTakeover: true); |
| 302 testReturnHeaders('permessage-deflate; client_max_window_bits; ', | 364 testReturnHeaders('permessage-deflate; client_max_window_bits; ', |
| (...skipping 11 matching lines...) Expand all Loading... |
| 314 serverMaxWindowBits: 8); | 376 serverMaxWindowBits: 8); |
| 315 testClientRequestHeaders(compression); | 377 testClientRequestHeaders(compression); |
| 316 } | 378 } |
| 317 } | 379 } |
| 318 | 380 |
| 319 main() { | 381 main() { |
| 320 new SecurityConfiguration(secure: false).runTests(); | 382 new SecurityConfiguration(secure: false).runTests(); |
| 321 // TODO(whesse): Make WebSocket.connect() take an optional context: parameter. | 383 // TODO(whesse): Make WebSocket.connect() take an optional context: parameter. |
| 322 // new SecurityConfiguration(secure: true).runTests(); | 384 // new SecurityConfiguration(secure: true).runTests(); |
| 323 } | 385 } |
| OLD | NEW |