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

Side by Side Diff: sdk/lib/io/websocket_impl.dart

Issue 1904553006: Fix strong mode errors in dart:io. (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Fix directory_list rename for dartium. Created 4 years, 7 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/string_transformer.dart ('k') | tests/standalone/io/https_bad_certificate_test.dart » ('j') | 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 part of dart.io; 5 part of dart.io;
6 6
7 const String _webSocketGUID = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11"; 7 const String _webSocketGUID = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11";
8 const String _clientNoContextTakeover = "client_no_context_takeover"; 8 const String _clientNoContextTakeover = "client_no_context_takeover";
9 const String _serverNoContextTakeover = "server_no_context_takeover"; 9 const String _serverNoContextTakeover = "server_no_context_takeover";
10 const String _clientMaxWindowBits = "client_max_window_bits"; 10 const String _clientMaxWindowBits = "client_max_window_bits";
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
52 * The web socket protocol transformer handles the protocol byte stream 52 * The web socket protocol transformer handles the protocol byte stream
53 * which is supplied through the [:handleData:]. As the protocol is processed, 53 * which is supplied through the [:handleData:]. As the protocol is processed,
54 * it'll output frame data as either a List<int> or String. 54 * it'll output frame data as either a List<int> or String.
55 * 55 *
56 * Important information about usage: Be sure you use cancelOnError, so the 56 * Important information about usage: Be sure you use cancelOnError, so the
57 * socket will be closed when the processor encounter an error. Not using it 57 * socket will be closed when the processor encounter an error. Not using it
58 * will lead to undefined behaviour. 58 * will lead to undefined behaviour.
59 */ 59 */
60 // TODO(ajohnsen): make this transformer reusable? 60 // TODO(ajohnsen): make this transformer reusable?
61 class _WebSocketProtocolTransformer 61 class _WebSocketProtocolTransformer
62 implements StreamTransformer<List<int>, dynamic>, EventSink<List<int>> { 62 implements StreamTransformer<List<int>, dynamic>, EventSink<Uint8List> {
63 static const int START = 0; 63 static const int START = 0;
64 static const int LEN_FIRST = 1; 64 static const int LEN_FIRST = 1;
65 static const int LEN_REST = 2; 65 static const int LEN_REST = 2;
66 static const int MASK = 3; 66 static const int MASK = 3;
67 static const int PAYLOAD = 4; 67 static const int PAYLOAD = 4;
68 static const int CLOSED = 5; 68 static const int CLOSED = 5;
69 static const int FAILURE = 6; 69 static const int FAILURE = 6;
70 static const int FIN = 0x80; 70 static const int FIN = 0x80;
71 static const int RSV1 = 0x40; 71 static const int RSV1 = 0x40;
72 static const int RSV2 = 0x20; 72 static const int RSV2 = 0x20;
(...skipping 920 matching lines...) Expand 10 before | Expand all | Expand 10 after
993 request.headers.add("Sec-WebSocket-Protocol", protocols.toList()); 993 request.headers.add("Sec-WebSocket-Protocol", protocols.toList());
994 } 994 }
995 995
996 if (compression.enabled) { 996 if (compression.enabled) {
997 request.headers 997 request.headers
998 .add("Sec-WebSocket-Extensions", compression._createHeader()); 998 .add("Sec-WebSocket-Extensions", compression._createHeader());
999 } 999 }
1000 1000
1001 return request.close(); 1001 return request.close();
1002 }).then((response) { 1002 }).then((response) {
1003
1003 void error(String message) { 1004 void error(String message) {
1004 // Flush data. 1005 // Flush data.
1005 response.detachSocket().then((socket) { 1006 response.detachSocket().then((socket) {
1006 socket.destroy(); 1007 socket.destroy();
1007 }); 1008 });
1008 throw new WebSocketException(message); 1009 throw new WebSocketException(message);
1009 } 1010 }
1011
1010 if (response.statusCode != HttpStatus.SWITCHING_PROTOCOLS || 1012 if (response.statusCode != HttpStatus.SWITCHING_PROTOCOLS ||
1011 response.headers[HttpHeaders.CONNECTION] == null || 1013 response.headers[HttpHeaders.CONNECTION] == null ||
1012 !response.headers[HttpHeaders.CONNECTION] 1014 !response.headers[HttpHeaders.CONNECTION]
1013 .any((value) => value.toLowerCase() == "upgrade") || 1015 .any((value) => value.toLowerCase() == "upgrade") ||
1014 response.headers.value(HttpHeaders.UPGRADE).toLowerCase() != 1016 response.headers.value(HttpHeaders.UPGRADE).toLowerCase() !=
1015 "websocket") { 1017 "websocket") {
1016 error("Connection to '$uri' was not upgraded to websocket"); 1018 error("Connection to '$uri' was not upgraded to websocket");
1017 } 1019 }
1018 String accept = response.headers.value("Sec-WebSocket-Accept"); 1020 String accept = response.headers.value("Sec-WebSocket-Accept");
1019 if (accept == null) { 1021 if (accept == null) {
1020 error("Response did not contain a 'Sec-WebSocket-Accept' header"); 1022 error("Response did not contain a 'Sec-WebSocket-Accept' header");
1021 } 1023 }
1022 _SHA1 sha1 = new _SHA1(); 1024 _SHA1 sha1 = new _SHA1();
1023 sha1.add("$nonce$_webSocketGUID".codeUnits); 1025 sha1.add("$nonce$_webSocketGUID".codeUnits);
1024 List<int> expectedAccept = sha1.close(); 1026 List<int> expectedAccept = sha1.close();
1025 List<int> receivedAccept = _CryptoUtils.base64StringToBytes(accept); 1027 List<int> receivedAccept = _CryptoUtils.base64StringToBytes(accept);
1026 if (expectedAccept.length != receivedAccept.length) { 1028 if (expectedAccept.length != receivedAccept.length) {
1027 error("Reasponse header 'Sec-WebSocket-Accept' is the wrong length"); 1029 error("Reasponse header 'Sec-WebSocket-Accept' is the wrong length");
1028 } 1030 }
1029 for (int i = 0; i < expectedAccept.length; i++) { 1031 for (int i = 0; i < expectedAccept.length; i++) {
1030 if (expectedAccept[i] != receivedAccept[i]) { 1032 if (expectedAccept[i] != receivedAccept[i]) {
1031 error("Bad response 'Sec-WebSocket-Accept' header"); 1033 error("Bad response 'Sec-WebSocket-Accept' header");
1032 } 1034 }
1033 } 1035 }
1034 var protocol = response.headers.value('Sec-WebSocket-Protocol'); 1036 var protocol = response.headers.value('Sec-WebSocket-Protocol');
1035 1037
1036 _WebSocketPerMessageDeflate deflate = 1038 _WebSocketPerMessageDeflate deflate =
1037 negotiateClientCompression(response, compression); 1039 negotiateClientCompression(response, compression);
1038 1040
1039 return response.detachSocket().then((socket) => 1041 return response.detachSocket().then/*<WebSocket>*/((socket) =>
1040 new _WebSocketImpl._fromSocket( 1042 new _WebSocketImpl._fromSocket(
1041 socket, protocol, compression, false, deflate)); 1043 socket, protocol, compression, false, deflate));
1042 }); 1044 });
1043 } 1045 }
1044 1046
1045 static _WebSocketPerMessageDeflate negotiateClientCompression( 1047 static _WebSocketPerMessageDeflate negotiateClientCompression(
1046 HttpClientResponse response, CompressionOptions compression) { 1048 HttpClientResponse response, CompressionOptions compression) {
1047 String extensionHeader = response.headers.value('Sec-WebSocket-Extensions'); 1049 String extensionHeader = response.headers.value('Sec-WebSocket-Extensions');
1048 1050
1049 if (extensionHeader == null) { 1051 if (extensionHeader == null) {
1050 extensionHeader = ""; 1052 extensionHeader = "";
1051 } 1053 }
1052 1054
1053 var hv = HeaderValue.parse(extensionHeader, valueSeparator: ','); 1055 var hv = HeaderValue.parse(extensionHeader, valueSeparator: ',');
1054 1056
1055 if (compression.enabled && hv.value == PER_MESSAGE_DEFLATE) { 1057 if (compression.enabled && hv.value == PER_MESSAGE_DEFLATE) {
1056 var serverNoContextTakeover = 1058 var serverNoContextTakeover =
1057 hv.parameters.containsKey(_serverNoContextTakeover); 1059 hv.parameters.containsKey(_serverNoContextTakeover);
1058 var clientNoContextTakeover = 1060 var clientNoContextTakeover =
1059 hv.parameters.containsKey(_clientNoContextTakeover); 1061 hv.parameters.containsKey(_clientNoContextTakeover);
1060 1062
1061 int getWindowBits(String type) { 1063 int getWindowBits(String type) {
1062 var o = hv.parameters[type]; 1064 var o = hv.parameters[type];
1063 if (o == null) { 1065 if (o == null) {
1064 return DEFAULT_WINDOW_BITS; 1066 return DEFAULT_WINDOW_BITS;
1065 } 1067 }
1066 1068
1067 o = int.parse(o, onError: (s) => DEFAULT_WINDOW_BITS); 1069 return int.parse(o, onError: (s) => DEFAULT_WINDOW_BITS);
1068 return o;
1069 } 1070 }
1070 1071
1071 return new _WebSocketPerMessageDeflate( 1072 return new _WebSocketPerMessageDeflate(
1072 clientMaxWindowBits: getWindowBits(_clientMaxWindowBits), 1073 clientMaxWindowBits: getWindowBits(_clientMaxWindowBits),
1073 serverMaxWindowBits: getWindowBits(_serverMaxWindowBits), 1074 serverMaxWindowBits: getWindowBits(_serverMaxWindowBits),
1074 clientNoContextTakeover: clientNoContextTakeover, 1075 clientNoContextTakeover: clientNoContextTakeover,
1075 serverNoContextTakeover: serverNoContextTakeover); 1076 serverNoContextTakeover: serverNoContextTakeover);
1076 } 1077 }
1077 1078
1078 return null; 1079 return null;
(...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after
1213 _outCloseReason = reason; 1214 _outCloseReason = reason;
1214 } 1215 }
1215 _writeClosed = true; 1216 _writeClosed = true;
1216 _consumer.closeSocket(); 1217 _consumer.closeSocket();
1217 _webSockets.remove(_serviceId); 1218 _webSockets.remove(_serviceId);
1218 } 1219 }
1219 1220
1220 String get _serviceTypePath => 'io/websockets'; 1221 String get _serviceTypePath => 'io/websockets';
1221 String get _serviceTypeName => 'WebSocket'; 1222 String get _serviceTypeName => 'WebSocket';
1222 1223
1223 Map _toJSON(bool ref) { 1224 Map<String, dynamic> _toJSON(bool ref) {
1224 var name = '${_socket.address.host}:${_socket.port}'; 1225 var name = '${_socket.address.host}:${_socket.port}';
1225 var r = <String, dynamic>{ 1226 var r = <String, dynamic>{
1226 'id': _servicePath, 1227 'id': _servicePath,
1227 'type': _serviceType(ref), 1228 'type': _serviceType(ref),
1228 'name': name, 1229 'name': name,
1229 'user_name': name, 1230 'user_name': name,
1230 }; 1231 };
1231 if (ref) { 1232 if (ref) {
1232 return r; 1233 return r;
1233 } 1234 }
(...skipping 14 matching lines...) Expand all
1248 return code != null && 1249 return code != null &&
1249 (code < WebSocketStatus.NORMAL_CLOSURE || 1250 (code < WebSocketStatus.NORMAL_CLOSURE ||
1250 code == WebSocketStatus.RESERVED_1004 || 1251 code == WebSocketStatus.RESERVED_1004 ||
1251 code == WebSocketStatus.NO_STATUS_RECEIVED || 1252 code == WebSocketStatus.NO_STATUS_RECEIVED ||
1252 code == WebSocketStatus.ABNORMAL_CLOSURE || 1253 code == WebSocketStatus.ABNORMAL_CLOSURE ||
1253 (code > WebSocketStatus.INTERNAL_SERVER_ERROR && 1254 (code > WebSocketStatus.INTERNAL_SERVER_ERROR &&
1254 code < WebSocketStatus.RESERVED_1015) || 1255 code < WebSocketStatus.RESERVED_1015) ||
1255 (code >= WebSocketStatus.RESERVED_1015 && code < 3000)); 1256 (code >= WebSocketStatus.RESERVED_1015 && code < 3000));
1256 } 1257 }
1257 } 1258 }
OLDNEW
« no previous file with comments | « sdk/lib/io/string_transformer.dart ('k') | tests/standalone/io/https_bad_certificate_test.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698