use std::error::Error as StdError; use std::fmt; use std::future::Future; use std::pin::Pin; use std::sync::Arc; use std::task::{Context, Poll}; use std::time::Duration;
usecrate::rt::{Read, Write}; use futures_core::ready; use pin_project_lite::pin_project;
usecrate::body::{Body, Incoming as IncomingBody}; usecrate::proto; usecrate::rt::bounds::Http2ServerConnExec; usecrate::service::HttpService; usecrate::{common::time::Time, rt::Timer};
pin_project! { /// A [`Future`](core::future::Future) representing an HTTP/2 connection, bound to a /// [`Service`](crate::service::Service), returned from /// [`Builder::serve_connection`](struct.Builder.html#method.serve_connection). /// /// To drive HTTP on this connection this future **must be polled**, typically with /// `.await`. If it isn't polled, no progress will be made on this connection. #[must_use = "futures do nothing unless polled"] pubstruct Connection<T, S, E> where
S: HttpService<IncomingBody>,
{
conn: proto::h2::Server<T, S, S::ResBody, E>,
}
}
/// A configuration builder for HTTP/2 server connections. /// /// **Note**: The default values of options are *not considered stable*. They /// are subject to change at any time. #[derive(Clone, Debug)] pubstruct Builder<E> {
exec: E,
timer: Time,
h2_builder: proto::h2::server::Config,
}
impl<I, B, S, E> Connection<I, S, E> where
S: HttpService<IncomingBody, ResBody = B>,
S::Error: Into<Box<dyn StdError + Send + Sync>>,
I: Read + Write + Unpin,
B: Body + 'static,
B::Error: Into<Box<dyn StdError + Send + Sync>>,
E: Http2ServerConnExec<S::Future, B>,
{ /// Start a graceful shutdown process for this connection. /// /// This `Connection` should continue to be polled until shutdown /// can finish. /// /// # Note /// /// This should only be called while the `Connection` future is still /// pending. If called after `Connection::poll` has resolved, this does /// nothing. pubfn graceful_shutdown(mutself: Pin<&mutSelf>) { self.conn.graceful_shutdown();
}
}
fn poll(mutself: Pin<&mutSelf>, cx: &mut Context<'_>) -> Poll<Self::Output> { match ready!(Pin::new(&mutself.conn).poll(cx)) {
Ok(_done) => { //TODO: the proto::h2::Server no longer needs to return //the Dispatched enum
Poll::Ready(Ok(()))
}
Err(e) => Poll::Ready(Err(e)),
}
}
}
// ===== impl Builder =====
impl<E> Builder<E> { /// Create a new connection builder. /// /// This starts with the default options, and an executor which is a type /// that implements [`Http2ServerConnExec`] trait. /// /// [`Http2ServerConnExec`]: crate::rt::bounds::Http2ServerConnExec pubfn new(exec: E) -> Self { Self {
exec,
timer: Time::Empty,
h2_builder: Default::default(),
}
}
/// Configures the maximum number of pending reset streams allowed before a GOAWAY will be sent. /// /// This will default to the default value set by the [`h2` crate](https://crates.io/crates/h2). /// As of v0.4.0, it is 20. /// /// See <https://github.com/hyperium/hyper/issues/2877> for more information. pubfn max_pending_accept_reset_streams(&mutself, max: impl Into<Option<usize>>) -> &mutSelf { self.h2_builder.max_pending_accept_reset_streams = max.into(); self
}
/// Configures the maximum number of local reset streams allowed before a GOAWAY will be sent. /// /// If not set, hyper will use a default, currently of 1024. /// /// If `None` is supplied, hyper will not apply any limit. /// This is not advised, as it can potentially expose servers to DOS vulnerabilities. /// /// See <https://rustsec.org/advisories/RUSTSEC-2024-0003.html> for more information. #[cfg(feature = "http2")] #[cfg_attr(docsrs, doc(cfg(feature = "http2")))] pubfn max_local_error_reset_streams(&mutself, max: impl Into<Option<usize>>) -> &mutSelf { self.h2_builder.max_local_error_reset_streams = max.into(); self
}
/// Sets the [`SETTINGS_INITIAL_WINDOW_SIZE`][spec] option for HTTP2 /// stream-level flow control. /// /// Passing `None` will do nothing. /// /// If not set, hyper will use a default. /// /// [spec]: https://httpwg.org/specs/rfc9113.html#SETTINGS_INITIAL_WINDOW_SIZE pubfn initial_stream_window_size(&mutself, sz: impl Into<Option<u32>>) -> &mutSelf { iflet Some(sz) = sz.into() { self.h2_builder.adaptive_window = false; self.h2_builder.initial_stream_window_size = sz;
} self
}
/// Sets the max connection-level flow control for HTTP2. /// /// Passing `None` will do nothing. /// /// If not set, hyper will use a default. pubfn initial_connection_window_size(&mutself, sz: impl Into<Option<u32>>) -> &mutSelf { iflet Some(sz) = sz.into() { self.h2_builder.adaptive_window = false; self.h2_builder.initial_conn_window_size = sz;
} self
}
/// Sets whether to use an adaptive flow control. /// /// Enabling this will override the limits set in /// `initial_stream_window_size` and /// `initial_connection_window_size`. pubfn adaptive_window(&mutself, enabled: bool) -> &mutSelf { use proto::h2::SPEC_WINDOW_SIZE;
/// Sets the maximum frame size to use for HTTP2. /// /// Passing `None` will do nothing. /// /// If not set, hyper will use a default. pubfn max_frame_size(&mutself, sz: impl Into<Option<u32>>) -> &yle='color:red'>mutSelf { iflet Some(sz) = sz.into() { self.h2_builder.max_frame_size = sz;
} self
}
/// Sets the [`SETTINGS_MAX_CONCURRENT_STREAMS`][spec] option for HTTP2 /// connections. /// /// Default is 200, but not part of the stability of hyper. It could change /// in a future release. You are encouraged to set your own limit. /// /// Passing `None` will remove any limit. /// /// [spec]: https://httpwg.org/specs/rfc9113.html#SETTINGS_MAX_CONCURRENT_STREAMS pubfn max_concurrent_streams(&mutself, max: impl Into<Option<u32>>) -> &mutSelf { self.h2_builder.max_concurrent_streams = max.into(); self
}
/// Sets an interval for HTTP2 Ping frames should be sent to keep a /// connection alive. /// /// Pass `None` to disable HTTP2 keep-alive. /// /// Default is currently disabled. pubfn keep_alive_interval(&mutself, interval: impl Into<Option<Duration>>) -> &mutSelf { self.h2_builder.keep_alive_interval = interval.into(); self
}
/// Sets a timeout for receiving an acknowledgement of the keep-alive ping. /// /// If the ping is not acknowledged within the timeout, the connection will /// be closed. Does nothing if `keep_alive_interval` is disabled. /// /// Default is 20 seconds. pubfn keep_alive_timeout(&mutself, timeout: Duration) -> &yle='color:red'>mutSelf { self.h2_builder.keep_alive_timeout = timeout; self
}
/// Set the maximum write buffer size for each HTTP/2 stream. /// /// Default is currently ~400KB, but may change. /// /// # Panics /// /// The value must be no larger than `u32::MAX`. pubfn max_send_buf_size(&mutself, max: usize) -> &mutSelf {
assert!(max <= u32::MAX as usize); self.h2_builder.max_send_buffer_size = max; self
}
/// Sets the max size of received header frames. /// /// Default is currently 16KB, but can change. pubfn max_header_list_size(&mutself, max: u32) -> &mutSelf { self.h2_builder.max_header_list_size = max; self
}
/// Set the timer used in background tasks. pubfn timer<M>(&mutself, timer: M) -> &mutSelf where
M: Timer + Send + Sync + 'static,
{ self.timer = Time::Timer(Arc::new(timer)); self
}
/// Set whether the `date` header should be included in HTTP responses. /// /// Note that including the `date` header is recommended by RFC 7231. /// /// Default is true. pubfn auto_date_header(&mutself, enabled: bool) -> &mutSelf { self.h2_builder.date_header = enabled; self
}
/// Bind a connection together with a [`Service`](crate::service::Service). /// /// This returns a Future that must be polled in order for HTTP to be /// driven on the connection. pubfn serve_connection<S, I, Bd>(&self, io: I, service: S) -> Connection<I, S, E> where
S: HttpService<IncomingBody, ResBody = Bd>,
S::Error: Into<Box<dyn StdError + Send + Sync>>,
Bd: Body + 'static,
Bd::Error: Into<Box<dyn StdError + Send + Sync>>,
I: Read + Write + Unpin,
E: Http2ServerConnExec<S::Future, Bd>,
{ let proto = proto::h2::Server::new(
io,
service,
&self.h2_builder, self.exec.clone(), self.timer.clone(),
);
Connection { conn: proto }
}
}
Messung V0.5 in Prozent
¤ Dauer der Verarbeitung: 0.23 Sekunden
(vorverarbeitet am 2026-08-25)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.