Skip to content

HTTP connection manager

Terminal network filter that speaks HTTP, runs the HTTP filter chain and routes requests to clusters.

AttachmentType URL (@type)Per-route overrideBuild feature
Filter chain (filters, terminal)type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManagerNot applicableNone

What it does

The HTTP connection manager (HCM) turns the connection's byte stream into HTTP requests, runs each request through its http_filters chain, and routes it with an inline route_config or a route configuration fetched over RDS. It is a terminal filter: exactly one HCM or TCP proxy ends every filter chain, and nothing may follow it.

Minimal configuration

The fragment sits under filter_chains[].filters of a listener:

- name: http_gateway
  typed_config:
    "@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager
    codec_type: AUTO
    http_filters:
      - name: envoy.filters.http.router
        typed_config:
          "@type": type.googleapis.com/envoy.extensions.filters.http.router.v3.Router
          start_child_span: false
    route_config:
      name: local_route
      virtual_hosts:
        - name: backend
          domains: ["*"]
          routes:
            - match: { prefix: "/" }
              route: { cluster: api }

Fields

FieldTypeRequiredDefaultDescription
codec_typeenumNoAUTOAUTO, HTTP1 or HTTP2. HTTP3 is rejected.
stat_prefixstringNo—Accepted for Envoy compatibility but ignored; Arion logs a warning.
http_filterslistYes—The HTTP filter chain. Must be non-empty and end with the router, which cannot be disabled.
route_config / rdsoneofYes—Inline route configuration, or RDS (see below).
request_timeoutdurationNounsetOverall timeout for a downstream request.
access_loglistNoemptyFile, stdout or stderr access loggers; see access logs.
upgrade_configslistNoemptyEnabled protocol upgrades. Only websocket is supported; connect is rejected.
use_remote_addressboolNofalseUse the direct peer address instead of x-forwarded-for when determining the client address.
xff_num_trusted_hopsuint32No0Number of trusted proxy hops counted from the right of x-forwarded-for.
skip_xff_appendboolNofalseDo not append the client address to x-forwarded-for.
generate_request_idboolNotrueGenerate x-request-id when absent.
preserve_external_request_idboolNofalseKeep an externally supplied x-request-id instead of replacing it.
always_set_request_id_in_responseboolNofalseEcho x-request-id in the response even when the client did not send one.
tracingobjectNounsetTrace sampling and exporter; see below.
early_header_mutation_extensionslistNoemptyheader_mutation extensions applied before routing.

Any other Envoy HCM field is unsupported: setting one makes Arion refuse to start, which is the compatibility promise.

Route specifier

route_config embeds a full route table (documented in the routes reference). rds subscribes to it over xDS instead; only the aggregated channel is supported:

rds:
  route_config_name: my_routes
  config_source:
    ads: {}

Tracing

tracing accepts client_sampling, random_sampling and overall_sampling (percentages, 0–100), verbose, max_path_tag_length, spawn_upstream_span, and a provider whose typed_config must be type.googleapis.com/envoy.config.trace.v3.OpenTelemetryConfig with a grpc_service and service_name. See tracing.

Ordering and interactions

Within a filter chain the HCM runs after network RBAC, rate limit and connection limit filters have admitted the connection. Its http_filters then run in list order per request, ending in the router; the response traverses filters that act on responses in reverse.

Continue

Start typing to search the site.

↑ ↓ to move Enter to open Esc to close