blob: 9926d61f5f1a615b049e04233c54a86a5dbfedbe [file] [log] [blame]
// 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;
/// An error occurred during the HTTP transaction.
struct Error {
/// The numerical error code.
///
/// These error codes correspond to
/// <https://fuchsia.googlesource.com/fuchsia/+/master/garnet/bin/network/net_error_list.h>
int32 code;
/// A textual description of the error in en-US.
string? description;
};
/// 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 either an HTTP request or an HTTP response.
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: handle<socket> stream;
};
/// 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.
///
/// Streaming the response can be more efficient if the response body is large
/// and can be processed incrementally (e.g., by an image decoder).
///
/// Buffering the response can be more efficient if the response body is in cache
/// and the cache entry can be directly mapped into the resulting buffer.
enum ResponseBodyMode {
/// The complete response body should be returned in the `buffer` field of
/// the response body.
///
/// The loader MAY abort the transation if the buffer size exceeds an
/// implementation-defined limit.
BUFFER = 0;
/// The response body should be streamed through the `stream` field of the
/// response body.
STREAM = 1;
};
/// An HTTP request.
struct Request {
/// The HTTP method if applicable.
string method = "GET";
/// The URL to load.
bytes url;
/// Additional HTTP request headers.
vector<Header>? 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.
Body? body;
/// The loader will cancel the request if the peer for this event is closed.
///
/// When this happens, the loader will send a Response with the appropriate
/// error code.
handle<eventpair>? event;
/// The cache behavior for the request.
CacheMode cache_mode = CacheMode.DEFAULT;
/// The response body mode.
ResponseBodyMode response_body_mode = ResponseBodyMode.BUFFER;
};
/// 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.
struct RedirectTarget {
/// The HTTP method the server suggested for the redirect.
string method;
/// The URL the server suggested for the redirect.
bytes url;
/// The referrer the server suggested for the redirect.
bytes referrer;
};
/// A response to an HTTP request.
struct Response {
/// If the response resulted in a network level error, this field will be set.
Error? error;
/// The response body.
Body? body;
/// The final URL of the response, after redirects have been followed.
bytes? url;
/// The HTTP status code.
///
/// 0 if not applicable.
uint32 status_code;
/// The HTTP status line.
string? status_line;
/// The HTTP response headers.
vector<Header>? headers;
/// The MIME type of the response body.
string? mime_type;
/// The character set of the response body.
string? charset;
};
/// 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` will be non-null
/// and 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, RedirectTarget? redirect) -> ();
};