diff options
| author | mo khan <mo@mokhan.ca> | 2025-07-15 16:37:08 -0600 |
|---|---|---|
| committer | mo khan <mo@mokhan.ca> | 2025-07-17 16:30:22 -0600 |
| commit | 45df4d0d9b577fecee798d672695fe24ff57fb1b (patch) | |
| tree | 1b99bf645035b58e0d6db08c7a83521f41f7a75b /vendor/hyper/src/server/conn | |
| parent | f94f79608393d4ab127db63cc41668445ef6b243 (diff) | |
feat: migrate from Cedar to SpiceDB authorization system
This is a major architectural change that replaces the Cedar policy-based
authorization system with SpiceDB's relation-based authorization.
Key changes:
- Migrate from Rust to Go implementation
- Replace Cedar policies with SpiceDB schema and relationships
- Switch from envoy `ext_authz` with Cedar to SpiceDB permission checks
- Update build system and dependencies for Go ecosystem
- Maintain Envoy integration for external authorization
This change enables more flexible permission modeling through SpiceDB's
Google Zanzibar inspired relation-based system, supporting complex
hierarchical permissions that were difficult to express in Cedar.
Breaking change: Existing Cedar policies and Rust-based configuration
will no longer work and need to be migrated to SpiceDB schema.
Diffstat (limited to 'vendor/hyper/src/server/conn')
| -rw-r--r-- | vendor/hyper/src/server/conn/http1.rs | 544 | ||||
| -rw-r--r-- | vendor/hyper/src/server/conn/http2.rs | 312 | ||||
| -rw-r--r-- | vendor/hyper/src/server/conn/mod.rs | 20 |
3 files changed, 0 insertions, 876 deletions
diff --git a/vendor/hyper/src/server/conn/http1.rs b/vendor/hyper/src/server/conn/http1.rs deleted file mode 100644 index af703018..00000000 --- a/vendor/hyper/src/server/conn/http1.rs +++ /dev/null @@ -1,544 +0,0 @@ -//! HTTP/1 Server Connections - -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; - -use crate::rt::{Read, Write}; -use crate::upgrade::Upgraded; -use bytes::Bytes; -use futures_util::ready; - -use crate::body::{Body, Incoming as IncomingBody}; -use crate::proto; -use crate::service::HttpService; -use crate::{ - common::time::{Dur, Time}, - rt::Timer, -}; - -type Http1Dispatcher<T, B, S> = proto::h1::Dispatcher< - proto::h1::dispatch::Server<S, IncomingBody>, - B, - T, - proto::ServerTransaction, ->; - -pin_project_lite::pin_project! { - /// A [`Future`](core::future::Future) representing an HTTP/1 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"] - pub struct Connection<T, S> - where - S: HttpService<IncomingBody>, - { - conn: Http1Dispatcher<T, S::ResBody, S>, - } -} - -/// A configuration builder for HTTP/1 server connections. -/// -/// **Note**: The default values of options are *not considered stable*. They -/// are subject to change at any time. -/// -/// # Example -/// -/// ``` -/// # use std::time::Duration; -/// # use hyper::server::conn::http1::Builder; -/// # fn main() { -/// let mut http = Builder::new(); -/// // Set options one at a time -/// http.half_close(false); -/// -/// // Or, chain multiple options -/// http.keep_alive(false).title_case_headers(true).max_buf_size(8192); -/// -/// # } -/// ``` -/// -/// Use [`Builder::serve_connection`](struct.Builder.html#method.serve_connection) -/// to bind the built connection to a service. -#[derive(Clone, Debug)] -pub struct Builder { - h1_parser_config: httparse::ParserConfig, - timer: Time, - h1_half_close: bool, - h1_keep_alive: bool, - h1_title_case_headers: bool, - h1_preserve_header_case: bool, - h1_max_headers: Option<usize>, - h1_header_read_timeout: Dur, - h1_writev: Option<bool>, - max_buf_size: Option<usize>, - pipeline_flush: bool, - date_header: bool, -} - -/// Deconstructed parts of a `Connection`. -/// -/// This allows taking apart a `Connection` at a later time, in order to -/// reclaim the IO object, and additional related pieces. -#[derive(Debug)] -#[non_exhaustive] -pub struct Parts<T, S> { - /// The original IO object used in the handshake. - pub io: T, - /// A buffer of bytes that have been read but not processed as HTTP. - /// - /// If the client sent additional bytes after its last request, and - /// this connection "ended" with an upgrade, the read buffer will contain - /// those bytes. - /// - /// You will want to check for any existing bytes if you plan to continue - /// communicating on the IO object. - pub read_buf: Bytes, - /// The `Service` used to serve this connection. - pub service: S, -} - -// ===== impl Connection ===== - -impl<I, S> fmt::Debug for Connection<I, S> -where - S: HttpService<IncomingBody>, -{ - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - f.debug_struct("Connection").finish() - } -} - -impl<I, B, S> Connection<I, S> -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>>, -{ - /// 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. - pub fn graceful_shutdown(mut self: Pin<&mut Self>) { - self.conn.disable_keep_alive(); - } - - /// Return the inner IO object, and additional information. - /// - /// If the IO object has been "rewound" the io will not contain those bytes rewound. - /// This should only be called after `poll_without_shutdown` signals - /// that the connection is "done". Otherwise, it may not have finished - /// flushing all necessary HTTP bytes. - /// - /// # Panics - /// This method will panic if this connection is using an h2 protocol. - pub fn into_parts(self) -> Parts<I, S> { - let (io, read_buf, dispatch) = self.conn.into_inner(); - Parts { - io, - read_buf, - service: dispatch.into_service(), - } - } - - /// Poll the connection for completion, but without calling `shutdown` - /// on the underlying IO. - /// - /// This is useful to allow running a connection while doing an HTTP - /// upgrade. Once the upgrade is completed, the connection would be "done", - /// but it is not desired to actually shutdown the IO object. Instead you - /// would take it back using `into_parts`. - pub fn poll_without_shutdown(&mut self, cx: &mut Context<'_>) -> Poll<crate::Result<()>> - where - S: Unpin, - S::Future: Unpin, - { - self.conn.poll_without_shutdown(cx) - } - - /// Prevent shutdown of the underlying IO object at the end of service the request, - /// instead run `into_parts`. This is a convenience wrapper over `poll_without_shutdown`. - /// - /// # Error - /// - /// This errors if the underlying connection protocol is not HTTP/1. - pub fn without_shutdown(self) -> impl Future<Output = crate::Result<Parts<I, S>>> { - let mut zelf = Some(self); - futures_util::future::poll_fn(move |cx| { - ready!(zelf.as_mut().unwrap().conn.poll_without_shutdown(cx))?; - Poll::Ready(Ok(zelf.take().unwrap().into_parts())) - }) - } - - /// Enable this connection to support higher-level HTTP upgrades. - /// - /// See [the `upgrade` module](crate::upgrade) for more. - pub fn with_upgrades(self) -> UpgradeableConnection<I, S> - where - I: Send, - { - UpgradeableConnection { inner: Some(self) } - } -} - -impl<I, B, S> Future for Connection<I, S> -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>>, -{ - type Output = crate::Result<()>; - - fn poll(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output> { - match ready!(Pin::new(&mut self.conn).poll(cx)) { - Ok(done) => { - match done { - proto::Dispatched::Shutdown => {} - proto::Dispatched::Upgrade(pending) => { - // With no `Send` bound on `I`, we can't try to do - // upgrades here. In case a user was trying to use - // `Body::on_upgrade` with this API, send a special - // error letting them know about that. - pending.manual(); - } - }; - Poll::Ready(Ok(())) - } - Err(e) => Poll::Ready(Err(e)), - } - } -} - -// ===== impl Builder ===== - -impl Builder { - /// Create a new connection builder. - pub fn new() -> Self { - Self { - h1_parser_config: Default::default(), - timer: Time::Empty, - h1_half_close: false, - h1_keep_alive: true, - h1_title_case_headers: false, - h1_preserve_header_case: false, - h1_max_headers: None, - h1_header_read_timeout: Dur::Default(Some(Duration::from_secs(30))), - h1_writev: None, - max_buf_size: None, - pipeline_flush: false, - date_header: true, - } - } - /// Set whether HTTP/1 connections should support half-closures. - /// - /// Clients can chose to shutdown their write-side while waiting - /// for the server to respond. Setting this to `true` will - /// prevent closing the connection immediately if `read` - /// detects an EOF in the middle of a request. - /// - /// Default is `false`. - pub fn half_close(&mut self, val: bool) -> &mut Self { - self.h1_half_close = val; - self - } - - /// Enables or disables HTTP/1 keep-alive. - /// - /// Default is true. - pub fn keep_alive(&mut self, val: bool) -> &mut Self { - self.h1_keep_alive = val; - self - } - - /// Set whether HTTP/1 connections will write header names as title case at - /// the socket level. - /// - /// Default is false. - pub fn title_case_headers(&mut self, enabled: bool) -> &mut Self { - self.h1_title_case_headers = enabled; - self - } - - /// Set whether HTTP/1 connections will silently ignored malformed header lines. - /// - /// If this is enabled and a header line does not start with a valid header - /// name, or does not include a colon at all, the line will be silently ignored - /// and no error will be reported. - /// - /// Default is false. - pub fn ignore_invalid_headers(&mut self, enabled: bool) -> &mut Builder { - self.h1_parser_config - .ignore_invalid_headers_in_requests(enabled); - self - } - - /// Set whether to support preserving original header cases. - /// - /// Currently, this will record the original cases received, and store them - /// in a private extension on the `Request`. It will also look for and use - /// such an extension in any provided `Response`. - /// - /// Since the relevant extension is still private, there is no way to - /// interact with the original cases. The only effect this can have now is - /// to forward the cases in a proxy-like fashion. - /// - /// Default is false. - pub fn preserve_header_case(&mut self, enabled: bool) -> &mut Self { - self.h1_preserve_header_case = enabled; - self - } - - /// Set the maximum number of headers. - /// - /// When a request is received, the parser will reserve a buffer to store headers for optimal - /// performance. - /// - /// If server receives more headers than the buffer size, it responds to the client with - /// "431 Request Header Fields Too Large". - /// - /// Note that headers is allocated on the stack by default, which has higher performance. After - /// setting this value, headers will be allocated in heap memory, that is, heap memory - /// allocation will occur for each request, and there will be a performance drop of about 5%. - /// - /// Default is 100. - pub fn max_headers(&mut self, val: usize) -> &mut Self { - self.h1_max_headers = Some(val); - self - } - - /// Set a timeout for reading client request headers. If a client does not - /// transmit the entire header within this time, the connection is closed. - /// - /// Requires a [`Timer`] set by [`Builder::timer`] to take effect. Panics if `header_read_timeout` is configured - /// without a [`Timer`]. - /// - /// Pass `None` to disable. - /// - /// Default is 30 seconds. - pub fn header_read_timeout(&mut self, read_timeout: impl Into<Option<Duration>>) -> &mut Self { - self.h1_header_read_timeout = Dur::Configured(read_timeout.into()); - self - } - - /// Set whether HTTP/1 connections should try to use vectored writes, - /// or always flatten into a single buffer. - /// - /// Note that setting this to false may mean more copies of body data, - /// but may also improve performance when an IO transport doesn't - /// support vectored writes well, such as most TLS implementations. - /// - /// Setting this to true will force hyper to use queued strategy - /// which may eliminate unnecessary cloning on some TLS backends - /// - /// Default is `auto`. In this mode hyper will try to guess which - /// mode to use - pub fn writev(&mut self, val: bool) -> &mut Self { - self.h1_writev = Some(val); - self - } - - /// Set the maximum buffer size for the connection. - /// - /// Default is ~400kb. - /// - /// # Panics - /// - /// The minimum value allowed is 8192. This method panics if the passed `max` is less than the minimum. - pub fn max_buf_size(&mut self, max: usize) -> &mut Self { - assert!( - max >= proto::h1::MINIMUM_MAX_BUFFER_SIZE, - "the max_buf_size cannot be smaller than the minimum that h1 specifies." - ); - self.max_buf_size = Some(max); - 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. - pub fn auto_date_header(&mut self, enabled: bool) -> &mut Self { - self.date_header = enabled; - self - } - - /// Aggregates flushes to better support pipelined responses. - /// - /// Experimental, may have bugs. - /// - /// Default is false. - pub fn pipeline_flush(&mut self, enabled: bool) -> &mut Self { - self.pipeline_flush = enabled; - self - } - - /// Set the timer used in background tasks. - pub fn timer<M>(&mut self, timer: M) -> &mut Self - where - M: Timer + Send + Sync + 'static, - { - self.timer = Time::Timer(Arc::new(timer)); - 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. - /// - /// # Panics - /// - /// If a timeout option has been configured, but a `timer` has not been - /// provided, calling `serve_connection` will panic. - /// - /// # Example - /// - /// ``` - /// # use hyper::{body::Incoming, Request, Response}; - /// # use hyper::service::Service; - /// # use hyper::server::conn::http1::Builder; - /// # use hyper::rt::{Read, Write}; - /// # async fn run<I, S>(some_io: I, some_service: S) - /// # where - /// # I: Read + Write + Unpin + Send + 'static, - /// # S: Service<hyper::Request<Incoming>, Response=hyper::Response<Incoming>> + Send + 'static, - /// # S::Error: Into<Box<dyn std::error::Error + Send + Sync>>, - /// # S::Future: Send, - /// # { - /// let http = Builder::new(); - /// let conn = http.serve_connection(some_io, some_service); - /// - /// if let Err(e) = conn.await { - /// eprintln!("server connection error: {}", e); - /// } - /// # } - /// # fn main() {} - /// ``` - pub fn serve_connection<I, S>(&self, io: I, service: S) -> Connection<I, S> - where - S: HttpService<IncomingBody>, - S::Error: Into<Box<dyn StdError + Send + Sync>>, - S::ResBody: 'static, - <S::ResBody as Body>::Error: Into<Box<dyn StdError + Send + Sync>>, - I: Read + Write + Unpin, - { - let mut conn = proto::Conn::new(io); - conn.set_h1_parser_config(self.h1_parser_config.clone()); - conn.set_timer(self.timer.clone()); - if !self.h1_keep_alive { - conn.disable_keep_alive(); - } - if self.h1_half_close { - conn.set_allow_half_close(); - } - if self.h1_title_case_headers { - conn.set_title_case_headers(); - } - if self.h1_preserve_header_case { - conn.set_preserve_header_case(); - } - if let Some(max_headers) = self.h1_max_headers { - conn.set_http1_max_headers(max_headers); - } - if let Some(dur) = self - .timer - .check(self.h1_header_read_timeout, "header_read_timeout") - { - conn.set_http1_header_read_timeout(dur); - }; - if let Some(writev) = self.h1_writev { - if writev { - conn.set_write_strategy_queue(); - } else { - conn.set_write_strategy_flatten(); - } - } - conn.set_flush_pipeline(self.pipeline_flush); - if let Some(max) = self.max_buf_size { - conn.set_max_buf_size(max); - } - if !self.date_header { - conn.disable_date_header(); - } - let sd = proto::h1::dispatch::Server::new(service); - let proto = proto::h1::Dispatcher::new(sd, conn); - Connection { conn: proto } - } -} - -/// A future binding a connection with a Service with Upgrade support. -#[must_use = "futures do nothing unless polled"] -#[allow(missing_debug_implementations)] -pub struct UpgradeableConnection<T, S> -where - S: HttpService<IncomingBody>, -{ - pub(super) inner: Option<Connection<T, S>>, -} - -impl<I, B, S> UpgradeableConnection<I, S> -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>>, -{ - /// Start a graceful shutdown process for this connection. - /// - /// This `Connection` should continue to be polled until shutdown - /// can finish. - pub fn graceful_shutdown(mut self: Pin<&mut Self>) { - // Connection (`inner`) is `None` if it was upgraded (and `poll` is `Ready`). - // In that case, we don't need to call `graceful_shutdown`. - if let Some(conn) = self.inner.as_mut() { - Pin::new(conn).graceful_shutdown() - } - } -} - -impl<I, B, S> Future for UpgradeableConnection<I, S> -where - S: HttpService<IncomingBody, ResBody = B>, - S::Error: Into<Box<dyn StdError + Send + Sync>>, - I: Read + Write + Unpin + Send + 'static, - B: Body + 'static, - B::Error: Into<Box<dyn StdError + Send + Sync>>, -{ - type Output = crate::Result<()>; - - fn poll(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output> { - if let Some(conn) = self.inner.as_mut() { - match ready!(Pin::new(&mut conn.conn).poll(cx)) { - Ok(proto::Dispatched::Shutdown) => Poll::Ready(Ok(())), - Ok(proto::Dispatched::Upgrade(pending)) => { - let (io, buf, _) = self.inner.take().unwrap().conn.into_inner(); - pending.fulfill(Upgraded::new(io, buf)); - Poll::Ready(Ok(())) - } - Err(e) => Poll::Ready(Err(e)), - } - } else { - // inner is `None`, meaning the connection was upgraded, thus it's `Poll::Ready(Ok(()))` - Poll::Ready(Ok(())) - } - } -} diff --git a/vendor/hyper/src/server/conn/http2.rs b/vendor/hyper/src/server/conn/http2.rs deleted file mode 100644 index e0d61c13..00000000 --- a/vendor/hyper/src/server/conn/http2.rs +++ /dev/null @@ -1,312 +0,0 @@ -//! HTTP/2 Server Connections - -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; - -use crate::rt::{Read, Write}; -use futures_util::ready; -use pin_project_lite::pin_project; - -use crate::body::{Body, Incoming as IncomingBody}; -use crate::proto; -use crate::rt::bounds::Http2ServerConnExec; -use crate::service::HttpService; -use crate::{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"] - pub struct 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)] -pub struct Builder<E> { - exec: E, - timer: Time, - h2_builder: proto::h2::server::Config, -} - -// ===== impl Connection ===== - -impl<I, S, E> fmt::Debug for Connection<I, S, E> -where - S: HttpService<IncomingBody>, -{ - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - f.debug_struct("Connection").finish() - } -} - -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. - pub fn graceful_shutdown(mut self: Pin<&mut Self>) { - self.conn.graceful_shutdown(); - } -} - -impl<I, B, S, E> Future for 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>, -{ - type Output = crate::Result<()>; - - fn poll(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output> { - match ready!(Pin::new(&mut self.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 - pub fn 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. - pub fn max_pending_accept_reset_streams(&mut self, max: impl Into<Option<usize>>) -> &mut Self { - 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")))] - pub fn max_local_error_reset_streams(&mut self, max: impl Into<Option<usize>>) -> &mut Self { - 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 - pub fn initial_stream_window_size(&mut self, sz: impl Into<Option<u32>>) -> &mut Self { - if let 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. - pub fn initial_connection_window_size(&mut self, sz: impl Into<Option<u32>>) -> &mut Self { - if let 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`. - pub fn adaptive_window(&mut self, enabled: bool) -> &mut Self { - use proto::h2::SPEC_WINDOW_SIZE; - - self.h2_builder.adaptive_window = enabled; - if enabled { - self.h2_builder.initial_conn_window_size = SPEC_WINDOW_SIZE; - self.h2_builder.initial_stream_window_size = SPEC_WINDOW_SIZE; - } - self - } - - /// Sets the maximum frame size to use for HTTP2. - /// - /// Passing `None` will do nothing. - /// - /// If not set, hyper will use a default. - pub fn max_frame_size(&mut self, sz: impl Into<Option<u32>>) -> &mut Self { - if let 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 - pub fn max_concurrent_streams(&mut self, max: impl Into<Option<u32>>) -> &mut Self { - 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. - pub fn keep_alive_interval(&mut self, interval: impl Into<Option<Duration>>) -> &mut Self { - 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. - pub fn keep_alive_timeout(&mut self, timeout: Duration) -> &mut Self { - 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`. - pub fn max_send_buf_size(&mut self, max: usize) -> &mut Self { - assert!(max <= u32::MAX as usize); - self.h2_builder.max_send_buffer_size = max; - self - } - - /// Enables the [extended CONNECT protocol]. - /// - /// [extended CONNECT protocol]: https://datatracker.ietf.org/doc/html/rfc8441#section-4 - pub fn enable_connect_protocol(&mut self) -> &mut Self { - self.h2_builder.enable_connect_protocol = true; - self - } - - /// Sets the max size of received header frames. - /// - /// Default is currently 16KB, but can change. - pub fn max_header_list_size(&mut self, max: u32) -> &mut Self { - self.h2_builder.max_header_list_size = max; - self - } - - /// Set the timer used in background tasks. - pub fn timer<M>(&mut self, timer: M) -> &mut Self - 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. - pub fn auto_date_header(&mut self, enabled: bool) -> &mut Self { - 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. - pub fn 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 } - } -} diff --git a/vendor/hyper/src/server/conn/mod.rs b/vendor/hyper/src/server/conn/mod.rs deleted file mode 100644 index 54b309e8..00000000 --- a/vendor/hyper/src/server/conn/mod.rs +++ /dev/null @@ -1,20 +0,0 @@ -//! Server connection API. -//! -//! The types in this module are to provide a lower-level API based around a -//! single connection. Accepting a connection and binding it with a service -//! are not handled at this level. This module provides the building blocks to -//! customize those things externally. -//! -//! This module is split by HTTP version, providing a connection builder for -//! each. They work similarly, but they each have specific options. -//! -//! If your server needs to support both versions, an auto-connection builder is -//! provided in the [`hyper-util`](https://github.com/hyperium/hyper-util/tree/master) -//! crate. This builder wraps the HTTP/1 and HTTP/2 connection builders from this -//! module, allowing you to set configuration for both. The builder will then check -//! the version of the incoming connection and serve it accordingly. - -#[cfg(feature = "http1")] -pub mod http1; -#[cfg(feature = "http2")] -pub mod http2; |
