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 |