Index: sdk/lib/io/http_impl.dart |
diff --git a/sdk/lib/io/http_impl.dart b/sdk/lib/io/http_impl.dart |
index a0c1730d7ab182f96adaff4d3674eb398c3e7cd7..08a6609b3f057ea6569d5506ac7b3818dca7964d 100644 |
--- a/sdk/lib/io/http_impl.dart |
+++ b/sdk/lib/io/http_impl.dart |
@@ -702,6 +702,8 @@ class _HttpClientRequest extends _HttpOutboundMessage<HttpClientRequest> |
final bool _usingProxy; |
+ Future<HttpClientResponse> _response; |
+ |
// TODO(ajohnsen): Get default value from client? |
bool _followRedirects = true; |
@@ -722,7 +724,20 @@ class _HttpClientRequest extends _HttpOutboundMessage<HttpClientRequest> |
} |
} |
- Future<HttpClientResponse> get response => _responseCompleter.future; |
+ Future<HttpClientResponse> get response { |
+ if (_response == null) { |
+ _response = Future.wait([_responseCompleter.future, super.done]) |
+ .then((list) => list[0]); |
+ } |
+ return _response; |
+ } |
+ |
+ Future<HttpClientResponse> get done => response; |
+ |
+ Future<HttpClientResponse> pipe(Stream<List<int>> stream) { |
+ super.pipe(stream); |
+ return response; |
+ } |
Future<HttpClientResponse> close() { |
super.close(); |
@@ -993,51 +1008,47 @@ class _HttpClientConnection { |
// data). |
_httpParser.responseToMethod = method; |
_streamFuture = outgoing.onStream((stream) { |
- // Sending request, set up response completer. |
- _nextResponseCompleter = new Completer(); |
- |
- var requestFuture = _socket.writeStream(stream) |
- .catchError((e) { |
- destroy(); |
- throw e; |
- }); |
- |
- // Listen for response. |
- _nextResponseCompleter.future |
- .then((incoming) { |
- incoming.dataDone.then((_) { |
- if (incoming.headers.persistentConnection && |
- request.persistentConnection) { |
- // Be sure we have written the full request. |
- requestFuture |
- .then((_) { |
+ return _socket.writeStream(stream) |
+ .then((s) { |
+ // Request sent, set up response completer. |
+ _nextResponseCompleter = new Completer(); |
+ |
+ // Listen for response. |
+ _nextResponseCompleter.future |
+ .then((incoming) { |
+ incoming.dataDone.then((_) { |
+ if (incoming.headers.persistentConnection && |
+ request.persistentConnection) { |
// Return connection, now we are done. |
_httpClient._returnConnection(this); |
_subscription.resume(); |
- }, |
- onError: (_) { |
- // Already handled. |
- }); |
- } else { |
- destroy(); |
- } |
- }); |
- request._onIncoming(incoming); |
- }) |
- // If we see a state error, we failed to get the 'first' element. |
- // Transform the error to a HttpParserException, for consistency. |
- .catchError((error) { |
- throw new HttpParserException( |
- "Connection closed before data was received"); |
- }, test: (error) => error is StateError) |
- .catchError((error) { |
- // We are done with the socket. |
+ } else { |
+ destroy(); |
+ } |
+ }); |
+ request._onIncoming(incoming); |
+ }) |
+ // If we see a state error, we failed to get the 'first' |
+ // element. |
+ // Transform the error to a HttpParserException, for |
+ // consistency. |
+ .catchError((error) { |
+ throw new HttpParserException( |
+ "Connection closed before data was received"); |
+ }, test: (error) => error is StateError) |
+ .catchError((error) { |
+ // We are done with the socket. |
+ destroy(); |
+ request._onError(error); |
+ }); |
+ |
+ // Resume the parser now we have a handler. |
+ _subscription.resume(); |
+ return s; |
+ }, onError: (e) { |
destroy(); |
- request._onError(error); |
+ throw e; |
}); |
- // Resume the parser now we have a handler. |
- _subscription.resume(); |
- return requestFuture; |
}); |
return request; |
} |