// Copyright 2015 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

library fuchsia.net.oldhttp;

/// Specify the cache behavior of the request.
enum CacheMode {
  /// Default behavior.
  DEFAULT = 0;

  /// The HTTP request will bypass the local cache and will have a
  /// 'Cache-Control: nocache' header added in that causes any proxy servers
  /// to also not satisfy the request from their cache.  This has the effect
  /// of forcing a full end-to-end fetch.
  BYPASS_CACHE = 1;

  /// The HTTP request will fail if it cannot serve the requested resource
  /// from the cache (or some equivalent local store).
  ONLY_FROM_CACHE = 2;
};

/// Specify the mechanism used to return the response body.
enum ResponseBodyMode {
  /// The complete response body should be returned in the `buffer` field of
  /// the response body.
  BUFFER = 0;
  /// The response body should be streamed through the `stream` field of the
  /// response body.
  STREAM = 1;
  /// The response body may be returned as a buffer or stream.
  BUFFER_OR_STREAM = 2;
};

struct URLRequest {
  /// The URL to load.
  string url;

  /// The HTTP method if applicable.
  string method = "GET";

  /// Additional HTTP request headers.
  vector<HttpHeader>? headers;

  /// The payload for the request body. For HTTP requests, the method must be set
  /// to "POST" or "PUT". If a buffer is used for the body, a Content-Length
  /// header will automatically be added.
  URLBody? body;

  /// The buffer size of the socket returned in URLResponse's `body` member.
  /// A value of 0 indicates that the default buffer size should be used.  This
  /// value is just a suggestion. The URLLoader may choose to ignore this value.
  uint32 response_body_buffer_size = 0;

  /// If set to true, then redirects will be automatically followed. Otherwise,
  /// when a redirect is encounterd, FollowRedirect must be called to proceed.
  bool auto_follow_redirects = false;

  /// The cache behavior for the request.
  CacheMode cache_mode = CacheMode.DEFAULT;

  /// The response body mode.
  ResponseBodyMode response_body_mode = ResponseBodyMode.STREAM;
};
