Chromium Code Reviews| Index: sdk/lib/io/websocket_impl.dart |
| diff --git a/sdk/lib/io/websocket_impl.dart b/sdk/lib/io/websocket_impl.dart |
| index 6c3f13ea5e91fbe9859916a01282b5134c72c0d0..9d2c7dd2e19f3edfb873695e43d53dc97e3eef52 100644 |
| --- a/sdk/lib/io/websocket_impl.dart |
| +++ b/sdk/lib/io/websocket_impl.dart |
| @@ -433,6 +433,7 @@ class _WebSocketImpl extends Stream<Event> implements WebSocket { |
| final Socket _socket; |
| int _readyState = WebSocket.CONNECTING; |
| + bool _writeClosed = false; |
| static final HttpClient _httpClient = new HttpClient(); |
| @@ -545,6 +546,7 @@ class _WebSocketImpl extends Stream<Event> implements WebSocket { |
| } |
| _readyState = WebSocket.CLOSED; |
| } |
| + if (_readyState == WebSocket.CLOSED) return; |
| _controller.add(new _WebSocketCloseEvent(clean, code, reason)); |
| _controller.close(); |
| }; |
| @@ -553,6 +555,18 @@ class _WebSocketImpl extends Stream<Event> implements WebSocket { |
| (data) => _processor.update(data, 0, data.length), |
| onDone: () => _processor.closed(), |
| onError: (error) => _controller.signalError(error)); |
| + |
| + _socket.done |
| + .catchError((error) { |
| + if (_readyState == WebSocket.CLOSED) return; |
| + _readyState = WebSocket.CLOSED; |
| + _controller.signalError(error); |
| + _controller.close(); |
| + _processor.closed(); |
|
Søren Gjesse
2013/02/28 17:15:24
As discussed offline there should probably be a _s
Anders Johnsen
2013/02/28 17:19:47
Done.
|
| + }) |
| + .whenComplete(() { |
| + _writeClosed = true; |
| + }); |
| } |
| StreamSubscription<Event> listen(void onData(Event event), |
| @@ -631,6 +645,7 @@ class _WebSocketImpl extends Stream<Event> implements WebSocket { |
| } |
| void _sendFrame(int opcode, [List<int> data]) { |
| + if (_writeClosed) return; |
| bool mask = false; // Masking not implemented for server. |
| int dataLength = data == null ? 0 : data.length; |
| // Determine the header size. |