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 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 | 8 |
9 // Matches _WebSocketOpcode. | 9 // Matches _WebSocketOpcode. |
10 class _WebSocketMessageType { | 10 class _WebSocketMessageType { |
(...skipping 941 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
952 Future get done => _sink.done; | 952 Future get done => _sink.done; |
953 | 953 |
954 Future close([int code, String reason]) { | 954 Future close([int code, String reason]) { |
955 if (_isReservedStatusCode(code)) { | 955 if (_isReservedStatusCode(code)) { |
956 throw new WebSocketException("Reserved status code $code"); | 956 throw new WebSocketException("Reserved status code $code"); |
957 } | 957 } |
958 if (_outCloseCode == null) { | 958 if (_outCloseCode == null) { |
959 _outCloseCode = code; | 959 _outCloseCode = code; |
960 _outCloseReason = reason; | 960 _outCloseReason = reason; |
961 } | 961 } |
962 if (_closeTimer == null && !_controller.isClosed) { | 962 if (!_controller.isClosed) { |
963 // When closing the web-socket, we no longer accept data. | 963 // If a close has not yet been received from the other end then |
964 _closeTimer = new Timer(const Duration(seconds: 5), () { | 964 // 1) make sure to listen on the stream so the close frame will be |
965 // Reuse code and reason from the local close. | 965 // processed if received. |
966 _closeCode = _outCloseCode; | 966 // 2) set a timer terminate the connection if a close frame is |
967 _closeReason = _outCloseReason; | 967 // not received. |
968 _subscription.cancel(); | 968 if (!_controller.hasListener) { |
969 _controller.close(); | 969 _controller.stream.drain().catchError((_) => {}); |
970 _webSockets.remove(_serviceId); | 970 } |
971 }); | 971 if (_closeTimer == null) { |
| 972 // When closing the web-socket, we no longer accept data. |
| 973 _closeTimer = new Timer(const Duration(seconds: 5), () { |
| 974 // Reuse code and reason from the local close. |
| 975 _closeCode = _outCloseCode; |
| 976 _closeReason = _outCloseReason; |
| 977 _subscription.cancel(); |
| 978 _controller.close(); |
| 979 _webSockets.remove(_serviceId); |
| 980 }); |
| 981 } |
972 } | 982 } |
973 return _sink.close(); | 983 return _sink.close(); |
974 } | 984 } |
975 | 985 |
976 void _close([int code, String reason]) { | 986 void _close([int code, String reason]) { |
977 if (_writeClosed) return; | 987 if (_writeClosed) return; |
978 if (_outCloseCode == null) { | 988 if (_outCloseCode == null) { |
979 _outCloseCode = code; | 989 _outCloseCode = code; |
980 _outCloseReason = reason; | 990 _outCloseReason = reason; |
981 } | 991 } |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1016 (code < WebSocketStatus.NORMAL_CLOSURE || | 1026 (code < WebSocketStatus.NORMAL_CLOSURE || |
1017 code == WebSocketStatus.RESERVED_1004 || | 1027 code == WebSocketStatus.RESERVED_1004 || |
1018 code == WebSocketStatus.NO_STATUS_RECEIVED || | 1028 code == WebSocketStatus.NO_STATUS_RECEIVED || |
1019 code == WebSocketStatus.ABNORMAL_CLOSURE || | 1029 code == WebSocketStatus.ABNORMAL_CLOSURE || |
1020 (code > WebSocketStatus.INTERNAL_SERVER_ERROR && | 1030 (code > WebSocketStatus.INTERNAL_SERVER_ERROR && |
1021 code < WebSocketStatus.RESERVED_1015) || | 1031 code < WebSocketStatus.RESERVED_1015) || |
1022 (code >= WebSocketStatus.RESERVED_1015 && | 1032 (code >= WebSocketStatus.RESERVED_1015 && |
1023 code < 3000)); | 1033 code < 3000)); |
1024 } | 1034 } |
1025 } | 1035 } |
OLD | NEW |