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 // OtherResources=certificates/server_chain.pem | 9 // OtherResources=certificates/server_chain.pem |
10 // OtherResources=certificates/server_key.pem | 10 // OtherResources=certificates/server_key.pem |
11 | 11 |
12 library dart.io; | 12 library dart.io; |
13 | 13 |
14 import "dart:async"; | 14 import "dart:async"; |
15 import "dart:convert" show BASE64; | |
16 import "dart:io"; | 15 import "dart:io"; |
17 import "dart:math"; | 16 import "dart:math"; |
18 import "dart:typed_data"; | 17 import "dart:typed_data"; |
19 | 18 |
20 import "package:async_helper/async_helper.dart"; | 19 import "package:async_helper/async_helper.dart"; |
21 import "package:expect/expect.dart"; | 20 import "package:expect/expect.dart"; |
22 import "package:path/path.dart"; | 21 import "package:path/path.dart"; |
23 | 22 |
24 import "hash_utils.dart"; | 23 part "../../../sdk/lib/io/crypto.dart"; |
25 | 24 |
26 const String webSocketGUID = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11"; | 25 const String webSocketGUID = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11"; |
27 const String CERT_NAME = 'localhost_cert'; | 26 const String CERT_NAME = 'localhost_cert'; |
28 const String HOST_NAME = 'localhost'; | 27 const String HOST_NAME = 'localhost'; |
29 | 28 |
30 String localFile(path) => Platform.script.resolve(path).toFilePath(); | 29 String localFile(path) => Platform.script.resolve(path).toFilePath(); |
31 | 30 |
32 SecurityContext serverContext = new SecurityContext() | 31 SecurityContext serverContext = new SecurityContext() |
33 ..useCertificateChain(localFile('certificates/server_chain.pem')) | 32 ..useCertificateChain(localFile('certificates/server_chain.pem')) |
34 ..usePrivateKey(localFile('certificates/server_key.pem'), | 33 ..usePrivateKey(localFile('certificates/server_key.pem'), |
(...skipping 19 matching lines...) Expand all Loading... |
54 WebSocket.connect('${secure ? "wss" : "ws"}://$HOST_NAME:$port/'); | 53 WebSocket.connect('${secure ? "wss" : "ws"}://$HOST_NAME:$port/'); |
55 | 54 |
56 void testForceCloseServerEnd(int totalConnections) { | 55 void testForceCloseServerEnd(int totalConnections) { |
57 createServer().then((server) { | 56 createServer().then((server) { |
58 server.listen((request) { | 57 server.listen((request) { |
59 var response = request.response; | 58 var response = request.response; |
60 response.statusCode = HttpStatus.SWITCHING_PROTOCOLS; | 59 response.statusCode = HttpStatus.SWITCHING_PROTOCOLS; |
61 response.headers.set(HttpHeaders.CONNECTION, "upgrade"); | 60 response.headers.set(HttpHeaders.CONNECTION, "upgrade"); |
62 response.headers.set(HttpHeaders.UPGRADE, "websocket"); | 61 response.headers.set(HttpHeaders.UPGRADE, "websocket"); |
63 String key = request.headers.value("Sec-WebSocket-Key"); | 62 String key = request.headers.value("Sec-WebSocket-Key"); |
64 var sha1 = new SHA1(); | 63 _SHA1 sha1 = new _SHA1(); |
65 sha1.add("$key$webSocketGUID".codeUnits); | 64 sha1.add("$key$webSocketGUID".codeUnits); |
66 String accept = BASE64.encode(sha1.close()); | 65 String accept = _CryptoUtils.bytesToBase64(sha1.close()); |
67 response.headers.add("Sec-WebSocket-Accept", accept); | 66 response.headers.add("Sec-WebSocket-Accept", accept); |
68 response.headers.contentLength = 0; | 67 response.headers.contentLength = 0; |
69 response.detachSocket().then((socket) { | 68 response.detachSocket().then((socket) { |
70 socket.destroy(); | 69 socket.destroy(); |
71 }); | 70 }); |
72 }); | 71 }); |
73 | 72 |
74 int closeCount = 0; | 73 int closeCount = 0; |
75 for (int i = 0; i < totalConnections; i++) { | 74 for (int i = 0; i < totalConnections; i++) { |
76 createClient(server.port).then((webSocket) { | 75 createClient(server.port).then((webSocket) { |
(...skipping 16 matching lines...) Expand all Loading... |
93 } | 92 } |
94 } | 93 } |
95 | 94 |
96 main() { | 95 main() { |
97 asyncStart(); | 96 asyncStart(); |
98 new SecurityConfiguration(secure: false).runTests(); | 97 new SecurityConfiguration(secure: false).runTests(); |
99 // TODO(whesse): WebSocket.connect needs an optional context: parameter | 98 // TODO(whesse): WebSocket.connect needs an optional context: parameter |
100 // new SecurityConfiguration(secure: true).runTests(); | 99 // new SecurityConfiguration(secure: true).runTests(); |
101 asyncEnd(); | 100 asyncEnd(); |
102 } | 101 } |
OLD | NEW |