Skip to main content

aws_smithy_http_server/
settings.rs

1/*
2 * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
3 * SPDX-License-Identifier: Apache-2.0
4 */
5
6//! Runtime settings and defaults for HTTP servers.
7//!
8//! Generated code selects the policy appropriate to the modeled operation and passes
9//! explicit configuration through. Omitted settings resolve to these runtime values;
10//! explicit zero values disable the corresponding protection.
11
12use std::{sync::Arc, time::Duration};
13
14use hyper_util::{
15    rt::{TokioExecutor, TokioTimer},
16    server::conn::auto::Builder,
17};
18
19/// Default body-read deadline for operations without an HTTP payload member.
20pub const DEFAULT_NON_PAYLOAD_REQUEST_BODY_READ_TIMEOUT: Duration = Duration::from_secs(5 * 60);
21
22/// Default body-read deadline for non-streaming HTTP payload operations.
23pub const DEFAULT_PAYLOAD_REQUEST_BODY_READ_TIMEOUT: Duration = Duration::from_secs(60 * 60);
24
25/// Default number of consecutive ready event-stream body frames before yielding.
26pub const DEFAULT_REQUEST_BODY_READ_POLL_BUDGET: usize = 32;
27
28/// Default RPC event-stream initial-message deadline; disabled unless configured.
29pub const DEFAULT_EVENT_STREAM_INITIAL_MESSAGE_TIMEOUT: Option<Duration> = None;
30
31/// Default event-stream message-completion deadline; disabled unless configured.
32pub const DEFAULT_EVENT_STREAM_MESSAGE_COMPLETION_TIMEOUT: Option<Duration> = None;
33
34/// Default event-stream idle deadline; disabled unless configured.
35pub const DEFAULT_EVENT_STREAM_IDLE_TIMEOUT: Option<Duration> = None;
36
37/// Default maximum buffered request-body bytes; zero means unlimited.
38pub const DEFAULT_REQUEST_BODY_MAX_BYTES: usize = 0;
39
40/// Effective body-read deadline for one operation. Zero disables it.
41#[derive(Debug, Clone, Copy)]
42pub(crate) struct RequestBodyReadTimeoutConfig {
43    pub(crate) timeout: Duration,
44    pub(crate) operation: &'static str,
45}
46
47impl RequestBodyReadTimeoutConfig {
48    pub(crate) fn new(timeout: Duration, operation: &'static str) -> Option<Self> {
49        (!timeout.is_zero()).then_some(Self { timeout, operation })
50    }
51
52    pub(crate) fn default_for_operation(payload: bool, operation: &'static str) -> Option<Self> {
53        let timeout = if payload {
54            DEFAULT_PAYLOAD_REQUEST_BODY_READ_TIMEOUT
55        } else {
56            DEFAULT_NON_PAYLOAD_REQUEST_BODY_READ_TIMEOUT
57        };
58        Self::new(timeout, operation)
59    }
60}
61
62/// Default maximum number of concurrently accepted TCP connections.
63pub const DEFAULT_MAX_CONNECTIONS: usize = 16_384;
64
65/// Default timeout for receiving a complete request head.
66pub const DEFAULT_HEADER_READ_TIMEOUT: Duration = Duration::from_secs(60);
67
68/// Default interval between HTTP/2 keep-alive pings.
69pub const DEFAULT_HTTP2_KEEP_ALIVE_INTERVAL: Duration = Duration::from_secs(20);
70
71/// Default timeout for receiving an HTTP/2 keep-alive ping acknowledgment.
72pub const DEFAULT_HTTP2_KEEP_ALIVE_TIMEOUT: Duration = Duration::from_secs(20);
73
74/// Graceful shutdown waits indefinitely unless a timeout is configured.
75pub const DEFAULT_SHUTDOWN_TIMEOUT: Option<Duration> = None;
76
77/// Creates a connection builder with the default HTTP/2 keep-alive settings.
78pub(crate) fn default_connection_builder() -> Builder<TokioExecutor> {
79    let mut builder = Builder::new(TokioExecutor::new());
80    builder
81        .http2()
82        .timer(TokioTimer::new())
83        .keep_alive_interval(Some(DEFAULT_HTTP2_KEEP_ALIVE_INTERVAL))
84        .keep_alive_timeout(DEFAULT_HTTP2_KEEP_ALIVE_TIMEOUT);
85    builder
86}
87
88/// Settings owned by the built-in serve loop.
89pub(crate) struct ServeSettings {
90    pub(crate) hyper_builder: Option<Arc<Builder<TokioExecutor>>>,
91    pub(crate) max_connections: Option<usize>,
92    pub(crate) header_read_timeout: Option<Duration>,
93    pub(crate) shutdown_timeout: Option<Duration>,
94}
95
96impl Default for ServeSettings {
97    fn default() -> Self {
98        Self {
99            hyper_builder: None,
100            max_connections: Some(DEFAULT_MAX_CONNECTIONS),
101            header_read_timeout: Some(DEFAULT_HEADER_READ_TIMEOUT),
102            shutdown_timeout: DEFAULT_SHUTDOWN_TIMEOUT,
103        }
104    }
105}