// 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 'base_request.dart';

/// The base class for HTTP responses.
///
/// Subclasses of [BaseResponse] are usually not constructed manually; instead,
/// they're returned by [BaseClient.send] or other HTTP client methods.
abstract class BaseResponse {
  /// The (frozen) request that triggered this response.
  final BaseRequest request;

  /// The status code of the response.
  final int statusCode;

  /// The reason phrase associated with the status code.
  final String reasonPhrase;

  /// The size of the response body, in bytes.
  ///
  /// If the size of the request is not known in advance, this is `null`.
  final int contentLength;

  // TODO(nweiz): automatically parse cookies from headers

  // TODO(nweiz): make this a HttpHeaders object.
  /// The headers for this response.
  final Map<String, String> headers;

  /// Whether this response is a redirect.
  final bool isRedirect;

  /// Whether the server requested that a persistent connection be maintained.
  final bool persistentConnection;

  /// Creates a new HTTP response.
  BaseResponse(
      this.statusCode,
      {this.contentLength,
       this.request,
       this.headers: const <String, String>{},
       this.isRedirect: false,
       this.persistentConnection: true,
       this.reasonPhrase}) {
    if (statusCode < 100) {
      throw new ArgumentError("Invalid status code $statusCode.");
    } else if (contentLength != null && contentLength < 0) {
      throw new ArgumentError("Invalid content length $contentLength.");
    }
  }
}