// 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) -> (); };