Chromium Code Reviews| 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 153 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 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 Loading... | |
| 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 } |
| OLD | NEW |