| Index: runtime/bin/http_impl.dart | 
| diff --git a/runtime/bin/http_impl.dart b/runtime/bin/http_impl.dart | 
| index e8e5ff14bf0c59d36a626089939a763f320d03c0..c7977a66344e5392579f0eb7a3da443751285484 100644 | 
| --- a/runtime/bin/http_impl.dart | 
| +++ b/runtime/bin/http_impl.dart | 
| @@ -467,7 +467,7 @@ class _HttpResponse extends _HttpRequestResponseBase implements HttpResponse { | 
| return _outputStream; | 
| } | 
|  | 
| -  Socket detachSocket() { | 
| +  DetachedSocket detachSocket() { | 
| if (_state >= DONE) throw new HttpException("Response closed"); | 
| // Ensure that headers are written. | 
| if (_state == START) { | 
| @@ -602,7 +602,7 @@ class _HttpResponse extends _HttpRequestResponseBase implements HttpResponse { | 
| // whether the content length is known. | 
| if (_contentLength > 0) { | 
| _headers.set("Content-Length", _contentLength.toString()); | 
| -    } else { | 
| +    } else if (_contentLength < 0) { | 
| _headers.set("Transfer-Encoding", "chunked"); | 
| } | 
|  | 
| @@ -745,8 +745,10 @@ class _HttpConnectionBase implements Hashable { | 
| int parsed = _httpParser.writeList(buffer, 0, bytesRead); | 
| if (!_httpParser.upgrade) { | 
| if (parsed != bytesRead) { | 
| -          // TODO(sgjesse): Error handling. | 
| -          _close(); | 
| +          if (_socket != null) { | 
| +            // TODO(sgjesse): Error handling. | 
| +            _close(); | 
| +          } | 
| } | 
| } | 
| } | 
| @@ -766,16 +768,15 @@ class _HttpConnectionBase implements Hashable { | 
| _onConnectionClosed(e); | 
| } | 
|  | 
| -  Socket _detachSocket() { | 
| +  DetachedSocket _detachSocket() { | 
| _socket.onData = null; | 
| -    // TODO(sgjesse): Handle getting the write handler when using output stream. | 
| -    //_socket.onWrite = null; | 
| _socket.onClosed = null; | 
| _socket.onError = null; | 
| +    _socket.outputStream.onNoPendingWrites = null; | 
| Socket socket = _socket; | 
| _socket = null; | 
| -    if (onDetach) onDetach(); | 
| -    return socket; | 
| +    if (onDetach != null) onDetach(); | 
| +    return new _DetachedSocket(socket, _httpParser.unparsedData); | 
| } | 
|  | 
| abstract void _onConnectionClosed(e); | 
| @@ -1231,6 +1232,10 @@ class _HttpClientConnection | 
| return _request; | 
| } | 
|  | 
| +  DetachedSocket detachSocket() { | 
| +    return _detachSocket(); | 
| +  } | 
| + | 
| void _onConnectionClosed(e) { | 
| // Socket is closed either due to an error or due to normal socket close. | 
| if (e != null) { | 
| @@ -1506,3 +1511,12 @@ class _HttpClient implements HttpClient { | 
| Timer _evictionTimer; | 
| bool _shutdown;  // Has this HTTP client been shutdown? | 
| } | 
| + | 
| + | 
| +class _DetachedSocket implements DetachedSocket { | 
| +  _DetachedSocket(this._socket, this._unparsedData); | 
| +  Socket get socket() => _socket; | 
| +  List<int> get unparsedData() => _unparsedData; | 
| +  Socket _socket; | 
| +  List<int> _unparsedData; | 
| +} | 
|  |