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

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

Issue 11439029: Fix SecureSocket bug where socket was not closed after all data was flushed. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Make sure close() can be called multiple times. Created 8 years 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 | « no previous file | tests/standalone/standalone.status » ('j') | tests/standalone/standalone.status » ('J')
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: sdk/lib/io/secure_socket.dart
diff --git a/sdk/lib/io/secure_socket.dart b/sdk/lib/io/secure_socket.dart
index 17061b47266fd8b5e359a29b22d1a0f8982a2ac8..cbcf322c4fbc4bb0f1529fea7846f090a9d1d67e 100644
--- a/sdk/lib/io/secure_socket.dart
+++ b/sdk/lib/io/secure_socket.dart
@@ -218,12 +218,16 @@ class _SecureSocket implements SecureSocket {
}
void close([bool halfClose = false]) {
+ if (_status == CLOSED) return;
if (halfClose) {
_closedWrite = true;
_writeEncryptedData();
if (_filterWriteEmpty) {
_socket.close(true);
_socketClosedWrite = true;
+ if (_closedRead) {
+ close(false);
+ }
}
} else {
_closedWrite = true;
@@ -328,8 +332,7 @@ class _SecureSocket implements SecureSocket {
void _secureWriteHandler() {
_writeEncryptedData();
if (_filterWriteEmpty && _closedWrite && !_socketClosedWrite) {
- _socket.close(true);
- _sockedClosedWrite = true;
+ close(true);
}
if (_status == HANDSHAKE) {
_secureHandshake();
@@ -363,6 +366,8 @@ class _SecureSocket implements SecureSocket {
if (_socketDataHandler != null) {
_socketDataHandler();
}
+ } else if (_socketClosedRead) {
+ _secureCloseHandler();
}
}
}
@@ -397,14 +402,18 @@ class _SecureSocket implements SecureSocket {
}
void _secureCloseHandler() {
+ if (_closedRead) return;
_socketClosedRead = true;
if (_filterReadEmpty) {
_closedRead = true;
- _fireCloseEvent();
+ if (scheduledDataEvent != null) {
+ scheduledDataEvent.cancel();
+ }
+ if (_socketCloseHandler != null) {
+ _socketCloseHandler();
+ }
if (_socketClosedWrite) {
- _secureFilter.destroy();
- _secureFilter = null;
- _status = CLOSED;
+ close(false);
}
}
}
@@ -431,16 +440,7 @@ class _SecureSocket implements SecureSocket {
// True if the underlying socket is closed, the filter has been emptied of
// all data, and the close event has been fired.
- get _closed => _socketClosed && !_fireCloseEventPending;
-
- void _fireCloseEvent() {
- if (scheduledDataEvent != null) {
- scheduledDataEvent.cancel();
- }
- if (_socketCloseHandler != null) {
- _socketCloseHandler();
- }
- }
+ get _closed => _socketClosed;
void _readEncryptedData() {
// Read from the socket, and push it through the filter as far as
@@ -549,7 +549,7 @@ class _SecureSocket implements SecureSocket {
if (_filterReadEmpty) {
// This can't be an else clause: the value of _filterReadEmpty changes.
// This must be asynchronous, because we are in a read or readList call.
- new Timer(0, (_) => _fireCloseEvent());
+ new Timer(0, (_) => _secureCloseHandler());
}
}
}
« no previous file with comments | « no previous file | tests/standalone/standalone.status » ('j') | tests/standalone/standalone.status » ('J')

Powered by Google App Engine
This is Rietveld 408576698