HTTP connection management

    HTTP connection manager configuration.

    Envoy’s HTTP connection manager has native support for HTTP/1.1, WebSockets, HTTP/2 and HTTP/3. It does not support SPDY. Envoy’s HTTP support was designed to first and foremost be an HTTP/2 multiplexing proxy. Internally, HTTP/2 terminology is used to describe system components. For example, an HTTP request and response take place on a stream. A codec API is used to translate from different wire protocols into a protocol agnostic form for streams, requests, responses, etc. In the case of HTTP/1.1, the codec translates the serial/pipelining capabilities of the protocol into something that looks like HTTP/2 to higher layers. This means that the majority of the code does not need to understand whether a stream originated on an HTTP/1.1, HTTP/2, or HTTP/3 connection.

    HTTP header sanitizing

    The HTTP connection manager performs various header sanitizing actions for security reasons.

    Each has an associated route table. The route table can be specified in one of two ways:

    • Statically.

    • Dynamically via the .

    Retry plugin configuration

    Normally during retries, host selection follows the same process as the original request. Retry plugins can be used to modify this behavior, and they fall into two categories:

    • : These predicates can be used to adjust the priority load used when selecting a priority for a retry attempt. Only one such predicate may be specified.

      Envoy supports the following built-in priority predicates

      • envoy.retry_priorities.previous_priorities: This will keep track of previously attempted priorities, and adjust the priority load such that other priorities will be targeted in subsequent retry attempts.

    Host selection will continue until either the configured predicates accept the host or a configurable max attempts has been reached.

    These plugins can be combined to affect both host selection and priority load. Envoy can also be extended with custom retry plugins similar to how custom filters can be added.

    Configuration Example

    For example, to configure retries to prefer hosts that haven’t been attempted already, the built-in predicate can be used:

    To reject a host based on its metadata, envoy.retry_host_predicates.omit_host_metadata can be used:

    This will reject any host with matching (key, value) in its metadata.

    To configure retries to attempt other priorities during retries, the built-in can be used.

    This will target priorities in subsequent retry attempts that haven’t been already used. The update_frequency parameter decides how often the priority load should be recalculated.

    These plugins can be combined, which will exclude both previously attempted hosts as well as previously attempted priorities.

    Envoy supports handling 3xx redirects internally, that is capturing a configurable 3xx redirect response, synthesizing a new request, sending it to the upstream specified by the new route match, and returning the redirected response as the response to the original request. The headers and body of the original request will be sent in the redirect to the new location. Trailers are not yet supported.

    Internal redirects are configured via the field in route configuration. When redirect handling is on, any 3xx response from upstream, that matches redirect_response_codes is subject to the redirect being handled by Envoy.

    If Envoy is configured to internally redirect HTTP 303 and receives an HTTP 303 response, it will dispatch the redirect with a bodiless HTTP GET if the original request was not a GET or HEAD request. Otherwise, Envoy will preserve the original HTTP method. For more information, see .

    For a redirect to be handled successfully it must pass the following checks:

    1. Have a response code matching one of redirect_response_codes, which is either 302 (by default), or a set of 3xx codes (301, 302, 303, 307, 308).

    2. Have a location header with a valid, fully qualified URL.

    3. The request must have been fully processed by Envoy.

    4. The request must be smaller than the limit.

    5. The number of previously handled internal redirect within a given downstream request does not exceed max internal redirects of the route that the request or redirected request is hitting.

    6. All accept the target route.

    Any failure will result in redirect being passed downstream instead.

    Since a redirected request may be bounced between different routes, any route in the chain of redirects that

    1. or has a max internal redirects smaller or equal to the redirect chain length when the redirect chain hits it

    2. or is disallowed by any of the

    will cause the redirect to be passed downstream.

    Two predicates can be used to create a DAG that defines the redirect chain, the previous routes predicate, and the . Specifically, the allow listed routes predicate defines edges of individual node in the DAG and the previous routes predicate defines “visited” state of the edges, so that loop can be avoided if so desired.

    A third predicate safe_cross_scheme can be used to prevent HTTP -> HTTPS redirect.

    Once the redirect has passed these checks, the request headers which were shipped to the original upstream will be modified by:

    1. Putting the fully qualified original request URL in the x-envoy-original-url header.

    2. Replacing the Authority/Host, Scheme, and Path headers with the values from the Location header.

    The altered request headers will then have a new route selected, be sent through a new filter chain, and then shipped upstream with all of the normal Envoy request sanitization taking place.

    Warning

    Note that HTTP connection manager sanitization such as clearing untrusted headers will only be applied once. Per-route header modifications will be applied on both the original route and the second route, even if they are the same, so be careful configuring header modification rules to avoid duplicating undesired header values.

    A sample redirect flow might look like this:

    1. Client sends a GET request for

    2. Upstream 1 sends a 302 with “location: http://baz.com/eep”

    3. Envoy proxies the response data for to the client as the response to the original request.

    Timeouts

    Various configurable timeouts apply to an HTTP connection and its constituent streams. Please see for an overview of important timeout configuration.

    Envoy maintains the insertion order of headers (and pseudo headers that begin with “:”) in the HTTP header map using a linked list data-structure, which is very fast when the number of headers is small. In addition it can use a map data-structure to ensure fast access to the various headers. The map will be used once the number of headers in a HTTP request/response reaches the value of the runtime feature. The default threshold value is set to 3, as previous experiments empirically showed that this value provides good performance for many use-cases.