// Copyright 2018 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.http;

using fuchsia.mem;
using fuchsia.url;
using zx;

alias Method = string:1024;

/// An error occurred during the HTTP transaction.
enum Error {
    /// Some other problem occurred that cannot be classified using one of the
    /// more specific statuses. Retry is optional.
    INTERNAL = 1;

    /// An HTTP parse error.
    UNABLE_TO_PARSE = 2;

    /// Indicates a channel (client or body sender) is closed.
    CHANNEL_CLOSED = 3;

    /// Error occurred while connecting.
    CONNECT = 4;

    /// The deadline specified in Request has passed
    DEADLINE_EXCEEDED = 5;
};

/// An HTTP header field.
struct Header {
    /// The name of the header field.
    bytes name;

    /// The value of the header field.
    bytes value;
};

/// The body of an HTTP request.
resource union Body {
    /// A buffer that will contain the complete request or response body.
    1: fuchsia.mem.Buffer buffer;

    /// A socket that will contain the streaming request or response body.
    2: zx.handle:SOCKET stream;
};

/// An HTTP request.
resource table Request {
    /// The HTTP method if applicable.
    ///
    /// Defaults to "GET".
    1: Method method;

    /// The URL to load.
    ///
    /// Required.
    2: fuchsia.url.Url url;

    /// Additional HTTP request headers.
    3: vector<Header>:MAX 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.
    4: Body body;

    /// Determines when to give up on waiting for a response from the server. If no deadline is
    /// provided, the implementation will provide a reasonable default.
    5: zx.time deadline;
};

/// A description of the redirect the server requested.
///
/// The semantics of an HTTP redirect vary according to the status code use to
/// generate the redirect. This structure ensures that the loader and its client
/// agree on the interpretation of the redirect response from the server.
table RedirectTarget {
    /// The HTTP method the server suggested for the redirect.
    1: Method method;

    /// The URL the server suggested for the redirect.
    2: fuchsia.url.Url url;

    /// The referrer the server suggested for the redirect.
    3: fuchsia.url.Url referrer;
};

/// A response to an HTTP request.
resource table Response {
    /// If the response resulted in a network level error, this field will be
    /// set.
    1: Error error;

    /// The response body.
    2: zx.handle:SOCKET body;

    /// The final URL of the response, after redirects have been followed.
    3: fuchsia.url.Url final_url;

    /// The HTTP status code.
    4: uint32 status_code;

    /// The HTTP status line.
    5: bytes status_line;

    /// The HTTP response headers.
    6: vector<Header>:MAX headers;

    /// A description of the redirect the server requested, if any.
    7: RedirectTarget redirect;
};

/// An HTTP loader.
///
/// The loader can service many HTTP requests concurrently. The loader tracks
/// all the outstanding requests and will cancel them all if the client closes
/// the loader interface.
[Discoverable]
protocol Loader {
    /// Initiate the given HTTP request, follow redirects, and return the final
    /// response.
    ///
    /// The loader will follow redirects (up to an implementation-defined limit)
    /// and return the final response as a reply to this message. To cancel the
    /// request, either close the loader interface or close the peer to the
    /// `event` included in the `request`.
    Fetch(Request request) -> (Response response);

    /// Initiate the given HTTP request and return all intermediate responses to
    /// the given client.
    ///
    /// Unlike `Fetch`, `Start` does not automatically follow all redirects.
    /// Instead, each individual response along the redirect chain is delivered
    /// to the `LoaderClient`.
    Start(Request request, LoaderClient client);
};

/// A client interface used with `Loader.Start`.
///
/// Closing the underlying channel will cancel the associated HTTP transaction.
protocol LoaderClient {
    /// Called by the loader when the loader receives an HTTP response.
    ///
    /// If the server has requested a redirect, then `redirect` in `response`
    /// table will describe the target the server requested. To follow the
    /// redirect, reply to this message. To not follow the redirect, close the
    /// underlying channel.
    OnResponse(Response response) -> ();
};
