// 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.

import 'dart:async';

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.
  EventSink<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)
      : _controller = new StreamController<List<int>>(sync: true),
        super(method, url);

  /// 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);
  }
}
