Index: pkg/http/lib/src/io_client.dart |
diff --git a/pkg/http/lib/src/io_client.dart b/pkg/http/lib/src/io_client.dart |
index 47fb1f04dc946eb616166189345104a0e35196b8..9bbb7ee00a4f5113ed9d25fb0097261b1358e13f 100644 |
--- a/pkg/http/lib/src/io_client.dart |
+++ b/pkg/http/lib/src/io_client.dart |
@@ -24,67 +24,38 @@ class IOClient extends BaseClient { |
Future<StreamedResponse> send(BaseRequest request) { |
var stream = request.finalize(); |
- var completer = new Completer<StreamedResponse>(); |
- var connection = _inner.openUrl(request.method, request.url); |
- bool completed = false; |
- connection.followRedirects = request.followRedirects; |
- connection.maxRedirects = request.maxRedirects; |
- connection.onError = (e) { |
- async.then((_) { |
- // TODO(nweiz): issue 4974 means that any errors that appear in the |
- // onRequest or onResponse callbacks get passed to onError. If the |
- // completer has already fired, we want to re-throw those exceptions |
- // to the top level so that they aren't silently ignored. |
- if (completed) throw e; |
- |
- completed = true; |
- completer.completeError(e); |
- }); |
- }; |
- |
- var pipeCompleter = new Completer(); |
- connection.onRequest = (underlyingRequest) { |
- underlyingRequest.contentLength = request.contentLength; |
- underlyingRequest.persistentConnection = request.persistentConnection; |
+ return _inner.openUrl(request.method, request.url).then((ioRequest) { |
+ ioRequest.followRedirects = request.followRedirects; |
+ ioRequest.maxRedirects = request.maxRedirects; |
+ ioRequest.contentLength = request.contentLength; |
+ ioRequest.persistentConnection = request.persistentConnection; |
request.headers.forEach((name, value) { |
- underlyingRequest.headers.set(name, value); |
+ ioRequest.headers.set(name, value); |
}); |
- |
- chainToCompleter( |
- stream.pipe(wrapOutputStream(underlyingRequest.outputStream)), |
- pipeCompleter); |
- }; |
- |
- connection.onResponse = (response) { |
+ return Future.wait([stream.pipe(ioRequest), ioRequest.response]) |
+ .then((list) => list[1]); |
+ }).then((response) { |
var headers = {}; |
response.headers.forEach((key, values) { |
headers[key] = values.join(','); |
}); |
- if (completed) return; |
- |
- completed = true; |
- completer.complete(new StreamedResponse( |
- wrapInputStream(response.inputStream), |
+ return new StreamedResponse( |
+ response, |
response.statusCode, |
response.contentLength, |
request: request, |
headers: headers, |
isRedirect: response.isRedirect, |
persistentConnection: response.persistentConnection, |
- reasonPhrase: response.reasonPhrase)); |
- }; |
- |
- return Future.wait([ |
- completer.future, |
- pipeCompleter.future |
- ]).then((values) => values.first); |
+ reasonPhrase: response.reasonPhrase); |
+ }); |
} |
/// Closes the client. This terminates all active connections. If a client |
/// remains unclosed, the Dart process may not terminate. |
void close() { |
- if (_inner != null) _inner.shutdown(force: true); |
+ if (_inner != null) _inner.close(force: true); |
_inner = null; |
} |
} |