blob: 945a4533d97e0eeec1fb6c3752c15f1893004390 [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 coorespond to
// <https://fuchsia.googlesource.com/garnet/+/master/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.
vector<uint8> name;
// The value of the header field.
vector<uint8> 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.
fuchsia.mem.Buffer buffer;
// A socket that will contain the streaming request or response body.
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.
vector<uint8> 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 = DEFAULT;
// The response body mode.
ResponseBodyMode response_body_mode = 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.
vector<uint8> url;
// The referrer the server suggested for the redirect.
vector<uint8> 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.
vector<uint8>? 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]
interface 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|.
1: 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|.
2: Start(Request request, LoaderClient client);
};
// A client interface used with |Loader.Start|.
//
// Closing the underlying channel will cancel the associated HTTP transaction.
interface 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.
1: OnResponse(Response response, RedirectTarget? redirect) -> ();
};