Skip to content
Snippets Groups Projects
Commit 94570784 authored by rnystrom@google.com's avatar rnystrom@google.com
Browse files

Drain HTTP request input streams before responding.

Review URL: https://codereview.chromium.org//12211052

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge@18185 260f80e4-7a28-3924-810f-c04153c831b5
parent d778d06e
No related branches found
No related tags found
No related merge requests found
......@@ -425,6 +425,21 @@ Future<bool> confirm(String message) {
.then((line) => new RegExp(r"^[yY]").hasMatch(line));
}
/// Reads and discards all output from [inputStream]. Returns a [Future] that
/// completes when the stream is closed.
Future drainInputStream(InputStream inputStream) {
var completer = new Completer();
if (inputStream.closed) {
completer.complete();
return completer.future;
}
inputStream.onClosed = () => completer.complete();
inputStream.onData = inputStream.read;
inputStream.onError = (error) => completer.completeError(error);
return completer.future;
}
/// Wraps [stream] in a single-subscription [Stream] that emits the same data.
ByteStream wrapInputStream(InputStream stream) {
var controller = new StreamController();
......
......@@ -38,7 +38,9 @@ void handleUpload(ScheduledServer server) {
server.handle('POST', '/upload', (request, response) {
// TODO(nweiz): Once a multipart/form-data parser in Dart exists, validate
// that the request body is correctly formatted. See issue 6952.
return server.url.then((url) {
return drainInputStream(request.inputStream).then((_) {
return server.url;
}).then((url) {
response.statusCode = 302;
response.headers.set('location', url.resolve('/create').toString());
response.outputStream.close();
......@@ -260,11 +262,13 @@ main() {
handleUploadForm(server);
server.handle('POST', '/upload', (request, response) {
response.statusCode = 400;
response.headers.contentType = new ContentType('application', 'xml');
response.outputStream.writeString('<Error><Message>Your request sucked.'
'</Message></Error>');
response.outputStream.close();
return drainInputStream(request.inputStream).then((_) {
response.statusCode = 400;
response.headers.contentType = new ContentType('application', 'xml');
response.outputStream.writeString('<Error><Message>Your request sucked.'
'</Message></Error>');
response.outputStream.close();
});
});
// TODO(nweiz): This should use the server's error message once the client
......@@ -282,8 +286,10 @@ main() {
handleUploadForm(server);
server.handle('POST', '/upload', (request, response) {
// don't set the location header
response.outputStream.close();
return drainInputStream(request.inputStream).then((_) {
// Don't set the location header.
response.outputStream.close();
});
});
expectLater(pub.nextErrLine(), equals('Failed to upload the package.'));
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment