| // 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:async'; |
| import 'dart:io'; |
| import 'dart:uri'; |
| |
| import 'byte_stream.dart'; |
| 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.sink], and when the sink is closed the request will end. |
| class StreamedRequest extends BaseRequest { |
| /// The sink 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. |
| StreamSink<List<int>> get sink => _controller.sink; |
| |
| /// The controller for [sink], from which [BaseRequest] will read data for |
| /// [finalize]. |
| final StreamController<List<int>> _controller; |
| |
| /// Creates a new streaming request. |
| StreamedRequest(String method, Uri url) |
| : super(method, url), |
| _controller = new StreamController<List<int>>(); |
| |
| /// Freezes all mutable fields other than [stream] and returns a |
| /// single-subscription [ByteStream] that emits the data being written to |
| /// [sink]. |
| ByteStream finalize() { |
| super.finalize(); |
| return new ByteStream(_controller.stream); |
| } |
| } |