blob: 3570541f653c114ef039d17569a70be98a46eb71 [file] [log] [blame]
// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
library streamed_request;
import 'dart:io';
import 'dart:uri';
import 'base_request.dart';
/// An HTTP request where the request body is sent asynchronously after the
/// connection has been established and the headers have been sent.
///
/// When the request is sent via [BaseClient.send], only the headers and
/// whatever data has already been written to [StreamedRequest.stream] will be
/// sent immediately. More data will be sent as soon as it's written to
/// [StreamedRequest.stream], and when the stream is closed the request will
/// end.
class StreamedRequest extends BaseRequest {
/// The stream to which to write data that will be sent as the request body.
/// This may be safely written to before the request is sent; the data will be
/// buffered.
///
/// Closing this signals the end of the request.
final OutputStream stream;
/// The stream from which the [BaseClient] will read the data in [stream] once
/// the request has been finalized.
final ListInputStream _inputStream;
/// Creates a new streaming request.
StreamedRequest(String method, Uri url)
: super(method, url),
stream = new ListOutputStream(),
_inputStream = new ListInputStream() {
// TODO(nweiz): pipe errors from the output stream to the input stream once
// issue 3657 is fixed
stream.onData = () => _inputStream.write(stream.read());
stream.onClosed = _inputStream.markEndOfStream;
}
/// Freezes all mutable fields other than [stream] and returns an [InputStream]
/// that emits the data being written to [stream].
InputStream finalize() {
super.finalize();
return _inputStream;
}
}