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 885 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
896 } | 896 } |
897 // Protocol close, use close code from transformer. | 897 // Protocol close, use close code from transformer. |
898 _closeCode = transformer.closeCode; | 898 _closeCode = transformer.closeCode; |
899 _closeReason = transformer.closeReason; | 899 _closeReason = transformer.closeReason; |
900 _controller.close(); | 900 _controller.close(); |
901 }, | 901 }, |
902 cancelOnError: true); | 902 cancelOnError: true); |
903 _subscription.pause(); | 903 _subscription.pause(); |
904 _controller = new StreamController(sync: true, | 904 _controller = new StreamController(sync: true, |
905 onListen: _subscription.resume, | 905 onListen: _subscription.resume, |
| 906 onCancel: () { |
| 907 _subscription.cancel(); |
| 908 _subscription = null; |
| 909 }, |
906 onPause: _subscription.pause, | 910 onPause: _subscription.pause, |
907 onResume: _subscription.resume); | 911 onResume: _subscription.resume); |
908 | 912 |
909 _webSockets[_serviceId] = this; | 913 _webSockets[_serviceId] = this; |
910 try { _socket._owner = this; } catch (_) {} | 914 try { _socket._owner = this; } catch (_) {} |
911 } | 915 } |
912 | 916 |
913 StreamSubscription listen(void onData(message), | 917 StreamSubscription listen(void onData(message), |
914 {Function onError, | 918 {Function onError, |
915 void onDone(), | 919 void onDone(), |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
958 if (_outCloseCode == null) { | 962 if (_outCloseCode == null) { |
959 _outCloseCode = code; | 963 _outCloseCode = code; |
960 _outCloseReason = reason; | 964 _outCloseReason = reason; |
961 } | 965 } |
962 if (!_controller.isClosed) { | 966 if (!_controller.isClosed) { |
963 // If a close has not yet been received from the other end then | 967 // If a close has not yet been received from the other end then |
964 // 1) make sure to listen on the stream so the close frame will be | 968 // 1) make sure to listen on the stream so the close frame will be |
965 // processed if received. | 969 // processed if received. |
966 // 2) set a timer terminate the connection if a close frame is | 970 // 2) set a timer terminate the connection if a close frame is |
967 // not received. | 971 // not received. |
968 if (!_controller.hasListener) { | 972 if (!_controller.hasListener && _subscription != null) { |
969 _controller.stream.drain().catchError((_) => {}); | 973 _controller.stream.drain().catchError((_) => {}); |
970 } | 974 } |
971 if (_closeTimer == null) { | 975 if (_closeTimer == null) { |
972 // When closing the web-socket, we no longer accept data. | 976 // When closing the web-socket, we no longer accept data. |
973 _closeTimer = new Timer(const Duration(seconds: 5), () { | 977 _closeTimer = new Timer(const Duration(seconds: 5), () { |
974 // Reuse code and reason from the local close. | 978 // Reuse code and reason from the local close. |
975 _closeCode = _outCloseCode; | 979 _closeCode = _outCloseCode; |
976 _closeReason = _outCloseReason; | 980 _closeReason = _outCloseReason; |
977 _subscription.cancel(); | 981 if (_subscription != null) _subscription.cancel(); |
978 _controller.close(); | 982 _controller.close(); |
979 _webSockets.remove(_serviceId); | 983 _webSockets.remove(_serviceId); |
980 }); | 984 }); |
981 } | 985 } |
982 } | 986 } |
983 return _sink.close(); | 987 return _sink.close(); |
984 } | 988 } |
985 | 989 |
986 void _close([int code, String reason]) { | 990 void _close([int code, String reason]) { |
987 if (_writeClosed) return; | 991 if (_writeClosed) return; |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1026 (code < WebSocketStatus.NORMAL_CLOSURE || | 1030 (code < WebSocketStatus.NORMAL_CLOSURE || |
1027 code == WebSocketStatus.RESERVED_1004 || | 1031 code == WebSocketStatus.RESERVED_1004 || |
1028 code == WebSocketStatus.NO_STATUS_RECEIVED || | 1032 code == WebSocketStatus.NO_STATUS_RECEIVED || |
1029 code == WebSocketStatus.ABNORMAL_CLOSURE || | 1033 code == WebSocketStatus.ABNORMAL_CLOSURE || |
1030 (code > WebSocketStatus.INTERNAL_SERVER_ERROR && | 1034 (code > WebSocketStatus.INTERNAL_SERVER_ERROR && |
1031 code < WebSocketStatus.RESERVED_1015) || | 1035 code < WebSocketStatus.RESERVED_1015) || |
1032 (code >= WebSocketStatus.RESERVED_1015 && | 1036 (code >= WebSocketStatus.RESERVED_1015 && |
1033 code < 3000)); | 1037 code < 3000)); |
1034 } | 1038 } |
1035 } | 1039 } |
OLD | NEW |