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

Unified Diff: sdk/lib/io/websocket_impl.dart

Issue 12380029: Keep track of closing socket, in WebSocket, so we don't write once the socket is closed. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 7 years, 10 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « sdk/lib/io/http_impl.dart ('k') | tests/standalone/io/web_socket_test.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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..9cdb8eb78dd82c0690bc33c6c6ef5ca9129d23ef 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,19 @@ 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();
+ _socket.destroy();
+ })
+ .whenComplete(() {
+ _writeClosed = true;
+ });
}
StreamSubscription<Event> listen(void onData(Event event),
@@ -631,6 +646,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.
« no previous file with comments | « sdk/lib/io/http_impl.dart ('k') | tests/standalone/io/web_socket_test.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698