Index: utils/pub/io.dart |
diff --git a/utils/pub/io.dart b/utils/pub/io.dart |
index 94e575e1c38cb0b5d0487a72ecd743bda1a1668d..5f5f70ce4046f7ae14bd554e26743e8359378fe9 100644 |
--- a/utils/pub/io.dart |
+++ b/utils/pub/io.dart |
@@ -666,6 +666,31 @@ Future _doProcess(Function fn, String executable, List<String> args, workingDir, |
return fn(executable, args, options); |
} |
+/// Closes [response] while ignoring the body of [request]. Returns a Future |
+/// that completes once the response is closed. |
+/// |
+/// Due to issue 6984, it's necessary to drain the request body before closing |
+/// the response. |
+Future closeHttpResponse(HttpRequest request, HttpResponse response) { |
+ // TODO(nweiz): remove this when issue 4061 is fixed. |
+ var stackTrace; |
+ try { |
+ throw ""; |
+ } catch (_, localStackTrace) { |
+ stackTrace = localStackTrace; |
+ } |
+ |
+ var completer = new Completer(); |
+ request.inputStream.onError = (e) => |
+ completer.completeException(e, stackTrace); |
+ request.inputStream.onData = request.inputStream.read; |
+ request.inputStream.onClosed = () { |
+ response.outputStream.close(); |
+ completer.complete(null); |
+ }; |
+ return completer.future; |
+} |
+ |
/** |
* Wraps [input] to provide a timeout. If [input] completes before |
* [milliseconds] have passed, then the return value completes in the same way. |