Configuration¶
Every server option is exposed in three equivalent ways:
- a CLI flag on the
h2corncommand - an
H2CORN_*environment variable - a key in a TOML config file (passed via
--configorH2CORN_CONFIG)
When the same option is provided in more than one place, the order of precedence is CLI > environment > TOML > defaults.
Convenience pair
--host / --port (and H2CORN_HOST / H2CORN_PORT) are accepted as a shortcut when you only need a single TCP listener and have not set bind. They cannot be combined with bind.
Option index¶
| Option | Default | CLI |
|---|---|---|
root_path | "" | -r, --root-path |
lifespan | 'auto' | --lifespan |
timeout_lifespan_startup | 60.0 | --timeout-lifespan-startup |
timeout_lifespan_shutdown | 30.0 | --timeout-lifespan-shutdown |
bind | ['127.0.0.1:8000'] | -b, --bind |
uds_permissions | None | --uds-permissions |
backlog | 1024 | --backlog |
reuse_port | False | --reuse-port / --no-reuse-port |
certfile | None | --certfile |
keyfile | None | --keyfile |
ca_certs | None | --ca-certs |
cert_reqs | 'none' | --cert-reqs |
pid | None | --pid |
user | None | -u, --user |
group | None | -g, --group |
umask | None | -m, --umask |
workers | 1 | -w, --workers |
runtime_threads | 2 | --runtime-threads |
loop | 'auto' | --loop |
loop_threads | 1 | --loop-threads |
max_requests | 0 | --max-requests |
max_requests_jitter | 0 | --max-requests-jitter |
timeout_worker_healthcheck | 30.0 | --timeout-worker-healthcheck |
http1 | True | --http1 / --no-http1 |
access_log | True | --access-log / --no-access-log |
max_concurrent_streams | 256 | --max-concurrent-streams |
limit_request_head_size | 1048576 | --limit-request-head-size |
limit_request_line | 16384 | --limit-request-line |
limit_request_fields | 100 | --limit-request-fields |
limit_request_field_size | 32768 | --limit-request-field-size |
h2_max_header_list_size | 1048576 | --h2-max-header-list-size |
h2_max_header_block_size | 1048576 | --h2-max-header-block-size |
h2_max_inbound_frame_size | 65536 | --h2-max-inbound-frame-size |
h2_initial_stream_window_size | 1048576 | --h2-initial-stream-window-size |
h2_initial_connection_window_size | 2097152 | --h2-initial-connection-window-size |
max_request_body_size | 1073741824 | --max-request-body-size |
limit_concurrency | 0 | --limit-concurrency |
limit_connections | 0 | --limit-connections |
timeout_handshake | 5.0 | --timeout-handshake |
timeout_graceful_shutdown | 30.0 | --timeout-graceful-shutdown |
timeout_keep_alive | 120.0 | --timeout-keep-alive |
timeout_request_header | 10.0 | --timeout-request-header |
timeout_request_body_idle | 60.0 | --timeout-request-body-idle |
h2_timeout_response_stall | 60.0 | --h2-timeout-response-stall |
websocket_max_message_size | 16777216 | --websocket-max-message-size |
websocket_per_message_deflate | True | --websocket-per-message-deflate / --no-websocket-per-message-deflate |
websocket_ping_interval | 60.0 | --websocket-ping-interval |
websocket_ping_timeout | 30.0 | --websocket-ping-timeout |
proxy_headers | False | --proxy-headers / --no-proxy-headers |
forwarded_allow_ips | ['127.0.0.1', '::1', 'unix'] | --forwarded-allow-ips |
proxy_protocol | 'off' | --proxy-protocol |
server_header | False | --server-header / --no-server-header |
date_header | True | --date-header / --no-date-header |
response_headers | () | --header |
Application¶
Where the ASGI app lives and how it is loaded.
root_path¶
ASGI root path (to mount the application at a subpath).
| Default | "" |
| CLI | -r, --root-path |
| Env | H2CORN_ROOT_PATH |
| TOML key | root_path |
### lifespan |
ASGI lifespan handling mode.
| Default | 'auto' |
| CLI | --lifespan |
| Env | H2CORN_LIFESPAN |
| TOML key | lifespan |
| Choices | auto, on, off |
### timeout_lifespan_startup |
Maximum time to wait for ASGI lifespan startup in seconds. Use 0 to disable.
| Default | 60.0 |
| CLI | --timeout-lifespan-startup |
| Env | H2CORN_TIMEOUT_LIFESPAN_STARTUP |
| TOML key | timeout_lifespan_startup |
### timeout_lifespan_shutdown |
Maximum time to wait for ASGI lifespan shutdown in seconds. Use 0 to disable.
| Default | 30.0 |
| CLI | --timeout-lifespan-shutdown |
| Env | H2CORN_TIMEOUT_LIFESPAN_SHUTDOWN |
| TOML key | timeout_lifespan_shutdown |
| ## Listeners |
How h2corn accepts connections.
bind¶
Listener addresses to bind. Repeat the flag to add more listeners. Supports HOST:PORT, [IPv6]:PORT, unix:PATH, and fd://N.
| Default | ['127.0.0.1:8000'] |
| CLI | -b, --bind |
| Env | H2CORN_BIND |
| TOML key | bind |
### uds_permissions |
Octal mask for Unix Domain Socket permissions.
| Default | None |
| CLI | --uds-permissions |
| Env | H2CORN_UDS_PERMISSIONS |
| TOML key | uds_permissions |
### backlog |
Maximum number of queued connections on the listening socket.
| Default | 1024 |
| CLI | --backlog |
| Env | H2CORN_BACKLOG |
| TOML key | backlog |
### reuse_port |
Set SO_REUSEPORT on the TCP listeners so other server processes can bind the same port — for zero-downtime deploys or independent processes. Workers of one server always share the inherited listener. TCP listeners only.
| Default | False |
| CLI | --reuse-port / --no-reuse-port |
| Env | H2CORN_REUSE_PORT |
| TOML key | reuse_port |
| Choices | true, false |
| ## TLS |
Direct TLS for TCP listeners. Leave unset when terminating TLS at a proxy.
certfile¶
PEM certificate chain file for direct TLS.
| Default | None |
| CLI | --certfile |
| Env | H2CORN_CERTFILE |
| TOML key | certfile |
### keyfile |
PEM private key file for direct TLS. Encrypted keys are not supported.
| Default | None |
| CLI | --keyfile |
| Env | H2CORN_KEYFILE |
| TOML key | keyfile |
### ca_certs |
PEM CA bundle used to verify client certificates for direct TLS.
| Default | None |
| CLI | --ca-certs |
| Env | H2CORN_CA_CERTS |
| TOML key | ca_certs |
### cert_reqs |
Client certificate verification mode for direct TLS.
| Default | 'none' |
| CLI | --cert-reqs |
| Env | H2CORN_CERT_REQS |
| TOML key | cert_reqs |
| Choices | none, optional, required |
| ## Process and workers |
Process identity, worker pool, and lifecycle on Unix.
pid¶
Write the server process PID to this file.
| Default | None |
| CLI | --pid |
| Env | H2CORN_PID |
| TOML key | pid |
### user |
User name or numeric UID for worker processes and created Unix sockets.
| Default | None |
| CLI | -u, --user |
| Env | H2CORN_USER |
| TOML key | user |
### group |
Group name or numeric GID for worker processes and created Unix sockets.
| Default | None |
| CLI | -g, --group |
| Env | H2CORN_GROUP |
| TOML key | group |
### umask |
Octal process umask to apply before creating files and sockets. Leave unset to preserve the inherited umask.
| Default | None |
| CLI | -m, --umask |
| Env | H2CORN_UMASK |
| TOML key | umask |
### workers |
Number of worker processes to spawn.
| Default | 1 |
| CLI | -w, --workers |
| Env | H2CORN_WORKERS |
| TOML key | workers |
### runtime_threads |
Number of Tokio runtime worker threads per worker process.
| Default | 2 |
| CLI | --runtime-threads |
| Env | H2CORN_RUNTIME_THREADS |
| TOML key | runtime_threads |
### loop |
Python event-loop implementation: 'auto' uses uvloop when installed (the 'h2corn[uvloop]' extra), otherwise the stdlib asyncio loop. h2corn runs its I/O in Rust, so this only affects how application callbacks are scheduled.
| Default | 'auto' |
| CLI | --loop |
| Env | H2CORN_LOOP |
| TOML key | loop |
| Choices | auto, asyncio, uvloop |
### loop_threads |
Number of Python event-loop threads per worker, balanced round-robin. Requires a free-threaded (no-GIL) interpreter; ignored on GIL builds. Composes with workers — keep workers x loop_threads at or below the core count.
| Default | 1 |
| CLI | --loop-threads |
| Env | H2CORN_LOOP_THREADS |
| TOML key | loop_threads |
### max_requests |
Maximum number of requests or WebSocket sessions a worker should complete before retiring. Use 0 to disable.
| Default | 0 |
| CLI | --max-requests |
| Env | H2CORN_MAX_REQUESTS |
| TOML key | max_requests |
### max_requests_jitter |
Maximum jitter added to max_requests to stagger worker retirements. Use 0 to disable.
| Default | 0 |
| CLI | --max-requests-jitter |
| Env | H2CORN_MAX_REQUESTS_JITTER |
| TOML key | max_requests_jitter |
### timeout_worker_healthcheck |
Maximum time between worker healthcheck heartbeats before the supervisor replaces the worker. Use 0 to disable.
| Default | 30.0 |
| CLI | --timeout-worker-healthcheck |
| Env | H2CORN_TIMEOUT_WORKER_HEALTHCHECK |
| TOML key | timeout_worker_healthcheck |
| ## HTTP and resource limits |
Protocol behavior and per-connection bounds.
http1¶
Whether to accept HTTP/1.1 connections. Intended for development; disable in production.
| Default | True |
| CLI | --http1 / --no-http1 |
| Env | H2CORN_HTTP1 |
| TOML key | http1 |
| Choices | true, false |
### access_log |
Whether to log requests to stderr.
| Default | True |
| CLI | --access-log / --no-access-log |
| Env | H2CORN_ACCESS_LOG |
| TOML key | access_log |
| Choices | true, false |
### max_concurrent_streams |
Maximum active HTTP/2 streams per connection.
| Default | 256 |
| CLI | --max-concurrent-streams |
| Env | H2CORN_MAX_CONCURRENT_STREAMS |
| TOML key | max_concurrent_streams |
### limit_request_head_size |
Maximum total HTTP/1.1 request head size in bytes. Use 0 for no limit.
| Default | 1048576 |
| CLI | --limit-request-head-size |
| Env | H2CORN_LIMIT_REQUEST_HEAD_SIZE |
| TOML key | limit_request_head_size |
### limit_request_line |
Maximum HTTP/1.1 request line size in bytes. Use 0 for no limit.
| Default | 16384 |
| CLI | --limit-request-line |
| Env | H2CORN_LIMIT_REQUEST_LINE |
| TOML key | limit_request_line |
### limit_request_fields |
Maximum number of request header fields; HTTP/2 counts every decoded field, including duplicates. Use 0 for no limit.
| Default | 100 |
| CLI | --limit-request-fields |
| Env | H2CORN_LIMIT_REQUEST_FIELDS |
| TOML key | limit_request_fields |
### limit_request_field_size |
Maximum individual HTTP/1.1 header field size in bytes. Use 0 for no limit.
| Default | 32768 |
| CLI | --limit-request-field-size |
| Env | H2CORN_LIMIT_REQUEST_FIELD_SIZE |
| TOML key | limit_request_field_size |
### h2_max_header_list_size |
Maximum decoded HTTP/2 header list size in bytes. Use 0 for no limit.
| Default | 1048576 |
| CLI | --h2-max-header-list-size |
| Env | H2CORN_H2_MAX_HEADER_LIST_SIZE |
| TOML key | h2_max_header_list_size |
### h2_max_header_block_size |
Maximum compressed HTTP/2 header block size in bytes while collecting HEADERS and CONTINUATION frames. Use 0 for no limit.
| Default | 1048576 |
| CLI | --h2-max-header-block-size |
| Env | H2CORN_H2_MAX_HEADER_BLOCK_SIZE |
| TOML key | h2_max_header_block_size |
### h2_max_inbound_frame_size |
Maximum inbound HTTP/2 frame payload size to accept and advertise via SETTINGS_MAX_FRAME_SIZE.
| Default | 65536 |
| CLI | --h2-max-inbound-frame-size |
| Env | H2CORN_H2_MAX_INBOUND_FRAME_SIZE |
| TOML key | h2_max_inbound_frame_size |
### h2_initial_stream_window_size |
HTTP/2 per-stream receive flow-control window in bytes (SETTINGS_INITIAL_WINDOW_SIZE). Bounds worst-case buffered upload bytes per stream; raise for high-bandwidth-delay uploads.
| Default | 1048576 |
| CLI | --h2-initial-stream-window-size |
| Env | H2CORN_H2_INITIAL_STREAM_WINDOW_SIZE |
| TOML key | h2_initial_stream_window_size |
### h2_initial_connection_window_size |
HTTP/2 connection-wide receive flow-control window in bytes. Bounds total buffered upload bytes per connection.
| Default | 2097152 |
| CLI | --h2-initial-connection-window-size |
| Env | H2CORN_H2_INITIAL_CONNECTION_WINDOW_SIZE |
| TOML key | h2_initial_connection_window_size |
### max_request_body_size |
Maximum request body size in bytes. Use 0 for no limit.
| Default | 1073741824 |
| CLI | --max-request-body-size |
| Env | H2CORN_MAX_REQUEST_BODY_SIZE |
| TOML key | max_request_body_size |
### limit_concurrency |
Maximum number of concurrent ASGI request or session tasks per worker. Use 0 for no limit.
| Default | 0 |
| CLI | --limit-concurrency |
| Env | H2CORN_LIMIT_CONCURRENCY |
| TOML key | limit_concurrency |
### limit_connections |
Maximum number of live client connections per worker. Use 0 for no limit.
| Default | 0 |
| CLI | --limit-connections |
| Env | H2CORN_LIMIT_CONNECTIONS |
| TOML key | limit_connections |
| ## Timeouts |
Connection-level timeouts. All values are in seconds; 0 disables.
timeout_handshake¶
Maximum time to establish a connection and TLS handshake, in seconds. Use 0 to disable.
| Default | 5.0 |
| CLI | --timeout-handshake |
| Env | H2CORN_TIMEOUT_HANDSHAKE |
| TOML key | timeout_handshake |
### timeout_graceful_shutdown |
Maximum time for workers to finish in-flight requests on shutdown, in seconds.
| Default | 30.0 |
| CLI | --timeout-graceful-shutdown |
| Env | H2CORN_TIMEOUT_GRACEFUL_SHUTDOWN |
| TOML key | timeout_graceful_shutdown |
### timeout_keep_alive |
Idle keep-alive timeout in seconds. Use 0 to disable.
| Default | 120.0 |
| CLI | --timeout-keep-alive |
| Env | H2CORN_TIMEOUT_KEEP_ALIVE |
| TOML key | timeout_keep_alive |
### timeout_request_header |
Idle timeout in seconds while reading an HTTP request head or an HTTP/2 header block. Use 0 to disable.
| Default | 10.0 |
| CLI | --timeout-request-header |
| Env | H2CORN_TIMEOUT_REQUEST_HEADER |
| TOML key | timeout_request_header |
### timeout_request_body_idle |
Idle timeout in seconds while reading an HTTP request body. Use 0 to disable.
| Default | 60.0 |
| CLI | --timeout-request-body-idle |
| Env | H2CORN_TIMEOUT_REQUEST_BODY_IDLE |
| TOML key | timeout_request_body_idle |
### h2_timeout_response_stall |
Timeout in seconds for HTTP/2 response body bytes pinned behind peer flow control. Use 0 to disable.
| Default | 60.0 |
| CLI | --h2-timeout-response-stall |
| Env | H2CORN_H2_TIMEOUT_RESPONSE_STALL |
| TOML key | h2_timeout_response_stall |
| ## WebSocket |
Limits and keep-alive for RFC 6455 and RFC 8441 WebSockets.
websocket_max_message_size¶
Maximum WebSocket message size in bytes. Defaults to 16 MiB. Use 'inherit' to follow max_request_body_size, or 0 for no limit.
| Default | 16777216 |
| CLI | --websocket-max-message-size |
| Env | H2CORN_WEBSOCKET_MAX_MESSAGE_SIZE |
| TOML key | websocket_max_message_size |
### websocket_per_message_deflate |
Whether to negotiate permessage-deflate for WebSockets when the client offers it.
| Default | True |
| CLI | --websocket-per-message-deflate / --no-websocket-per-message-deflate |
| Env | H2CORN_WEBSOCKET_PER_MESSAGE_DEFLATE |
| TOML key | websocket_per_message_deflate |
| Choices | true, false |
### websocket_ping_interval |
Interval in seconds between server WebSocket ping frames. Use 0 to disable.
| Default | 60.0 |
| CLI | --websocket-ping-interval |
| Env | H2CORN_WEBSOCKET_PING_INTERVAL |
| TOML key | websocket_ping_interval |
### websocket_ping_timeout |
Time limit in seconds to wait for a pong after a server WebSocket ping. Use 0 to disable.
| Default | 30.0 |
| CLI | --websocket-ping-timeout |
| Env | H2CORN_WEBSOCKET_PING_TIMEOUT |
| TOML key | websocket_ping_timeout |
| ## Proxy and response headers |
Trust boundaries with the upstream proxy and default response headers.
proxy_headers¶
Trust proxy headers (e.g., Forwarded, X-Forwarded-*) if the client IP is in forwarded_allow_ips.
| Default | False |
| CLI | --proxy-headers / --no-proxy-headers |
| Env | H2CORN_PROXY_HEADERS |
| TOML key | proxy_headers |
| Choices | true, false |
### forwarded_allow_ips |
Allowed IPs or networks (in CIDR notation) for proxy headers. Use '*' to trust all.
| Default | ['127.0.0.1', '::1', 'unix'] |
| CLI | --forwarded-allow-ips |
| Env | H2CORN_FORWARDED_ALLOW_IPS |
| TOML key | forwarded_allow_ips |
### proxy_protocol |
Expect HAProxy's PROXY protocol on inbound connections.
| Default | 'off' |
| CLI | --proxy-protocol |
| Env | H2CORN_PROXY_PROTOCOL |
| TOML key | proxy_protocol |
| Choices | off, v1, v2 |
### server_header |
Whether to add a default Server header when the application sets none.
| Default | False |
| CLI | --server-header / --no-server-header |
| Env | H2CORN_SERVER_HEADER |
| TOML key | server_header |
| Choices | true, false |
### date_header |
Whether to add a default Date header when the application sets none.
| Default | True |
| CLI | --date-header / --no-date-header |
| Env | H2CORN_DATE_HEADER |
| TOML key | date_header |
| Choices | true, false |
### response_headers |
Additional default response headers in name: value form. Repeat the flag to add more headers.
| Default | () |
| CLI | --header |
| Env | H2CORN_RESPONSE_HEADERS |
| TOML key | response_headers |
## Building a Config programmatically |
Config is a frozen dataclass; instantiate it directly or use one of the alternative constructors:
Immutable server configuration.
Every option is also exposed as a CLI flag and an H2CORN_* environment variable. The full list and defaults are documented in the configuration reference of the project documentation.
Resolution order (highest precedence first):
- CLI flags
- Environment variables
- TOML file (via
--configorH2CORN_CONFIG) - Built-in defaults
Validation runs in __post_init__. Invalid combinations (for example, certfile without keyfile, or a Unix listener with TLS) raise ValueError at construction time.
Unix listeners (unix:PATH) and the user/group/umask options are POSIX-only.
from_envclassmethod¶
Build a Config from H2CORN_* environment variables.
Each option's environment variable name is its field name in upper case, prefixed with H2CORN_ (for example, H2CORN_BIND, H2CORN_WORKERS, H2CORN_PROXY_HEADERS). Variables that are not set fall through to defaults; unrecognized variables are ignored.
The convenience pair H2CORN_HOST / H2CORN_PORT is accepted only when H2CORN_BIND is unset.
from_mappingclassmethod¶
Build a Config from a plain mapping (e.g. parsed JSON or TOML).
Keys must match either a field name on Config or the convenience keys host/port. Unknown keys raise ValueError. String values are coerced through the same parsing rules as the matching environment variable; non-string values are passed through and validated by __post_init__.
from_tomlclassmethod¶
Build a Config from a TOML file.
The file must be a flat table whose keys correspond to Config field names. Example:
bind = ["127.0.0.1:8000"]
workers = 4
proxy_headers = true
forwarded_allow_ips = ["127.0.0.1", "::1", "unix"]
http1 = false