Chromium Code Reviews| Index: sdk/lib/io/http_impl.dart |
| diff --git a/sdk/lib/io/http_impl.dart b/sdk/lib/io/http_impl.dart |
| index 5c4387e42cf93aee79508b36836eaab4b7ea2dc1..e225cc66ff5f69cc188d4f33edfab8cfe10ca387 100644 |
| --- a/sdk/lib/io/http_impl.dart |
| +++ b/sdk/lib/io/http_impl.dart |
| @@ -11,16 +11,17 @@ class _CloseQueue { |
| void add(_HttpConnectionBase connection) { |
| void closeIfDone() { |
| - // We only check for write closed here. This means that we are |
| - // not waiting for the client to half-close the socket before |
| - // fully closing the socket. |
| - if (!connection._isWriteClosed) return; |
| + // When either the client has closed or all data has been |
| + // written to the client we close the underlying socket |
| + // completely. |
| + if (!connection._isWriteClosed && !connection._isReadClosed) return; |
|
Mads Ager (google)
2012/11/20 08:04:28
Maybe remove the negations and make this:
if (con
Søren Gjesse
2012/11/20 08:15:11
Much better, done.
|
| _q.remove(connection); |
| connection._socket.close(); |
| if (connection.onClosed != null) connection.onClosed(); |
| } |
| - // If the connection is already fully closed don't insert it into the queue. |
| + // If the connection is already fully closed don't insert it into |
| + // the queue. |
| if (connection._isFullyClosed) { |
| connection._socket.close(); |
| if (connection.onClosed != null) connection.onClosed(); |
| @@ -46,10 +47,6 @@ class _CloseQueue { |
| if (!connection._isReadClosed) { |
| connection._socket.onClosed = () { |
| connection._state |= _HttpConnectionBase.READ_CLOSED; |
| - // This is a nop, as we are not using the read closed |
| - // information for anything. For both server and client |
| - // connections the inbound message have been read to |
| - // completion when the socket enters the close queue. |
| closeIfDone(); |
| }; |
| } else { |
| @@ -61,6 +58,7 @@ class _CloseQueue { |
| // If an error occurs immediately close the socket. |
| connection._socket.onError = (e) { |
| + connection._state |= _HttpConnectionBase.READ_CLOSED; |
| connection._state |= _HttpConnectionBase.WRITE_CLOSED; |
| closeIfDone(); |
| }; |
| @@ -876,24 +874,24 @@ class _HttpConnection extends _HttpConnectionBase { |
| } |
| void _checkDone() { |
| - if (_isAllDone) { |
| - // If we are done writing the response, and either the client |
| - // has closed or the connection is not persistent, we must |
| - // close. Also if using HTTP 1.0 and the content length was not |
| - // known we must close to indicate end of body. |
| + if (_isReadClosed) { |
| + // If the client closes the conversation is ended. |
| + _server._closeQueue.add(this); |
| + } else if (_isAllDone) { |
| + // If we are done writing the response, and the connection is |
| + // not persistent, we must close. Also if using HTTP 1.0 and the |
| + // content length was not known we must close to indicate end of |
| + // body. |
| bool close = |
| !_response.persistentConnection || |
| (_response._protocolVersion == "1.0" && _response._contentLength < 0); |
| _request = null; |
| _response = null; |
| - if (_isReadClosed || close) { |
| + if (close) { |
| _server._closeQueue.add(this); |
| } else { |
| _state = _HttpConnectionBase.IDLE; |
| } |
| - } else if (_state == _HttpConnectionBase.READ_CLOSED) { |
| - // If entering READ_CLOSED state while idle close the connection. |
| - _server._closeQueue.add(this); |
| } |
| } |