1#![allow(
24    clippy::type_complexity,
25    clippy::too_many_arguments,
26    clippy::borrow_interior_mutable_const
27)]
28#![doc(html_logo_url = "https://actix.rs/img/logo.png")]
29#![doc(html_favicon_url = "https://actix.rs/favicon.ico")]
30#![cfg_attr(docsrs, feature(doc_auto_cfg))]
31
32pub use http::{uri, uri::Uri, Method, StatusCode, Version};
33
34pub mod body;
35mod builder;
36mod config;
37mod date;
38#[cfg(feature = "__compress")]
39pub mod encoding;
40pub mod error;
41mod extensions;
42pub mod h1;
43#[cfg(feature = "http2")]
44pub mod h2;
45pub mod header;
46mod helpers;
47mod http_message;
48mod keep_alive;
49mod message;
50#[cfg(test)]
51mod notify_on_drop;
52mod payload;
53mod requests;
54mod responses;
55mod service;
56pub mod test;
57#[cfg(feature = "ws")]
58pub mod ws;
59
60#[allow(deprecated)]
61pub use self::payload::PayloadStream;
62#[cfg(feature = "__tls")]
63pub use self::service::TlsAcceptorConfig;
64pub use self::{
65    builder::HttpServiceBuilder,
66    config::ServiceConfig,
67    error::Error,
68    extensions::Extensions,
69    header::ContentEncoding,
70    http_message::HttpMessage,
71    keep_alive::KeepAlive,
72    message::{ConnectionType, Message},
73    payload::{BoxedPayloadStream, Payload},
74    requests::{Request, RequestHead, RequestHeadType},
75    responses::{Response, ResponseBuilder, ResponseHead},
76    service::HttpService,
77};
78
79#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash)]
81#[non_exhaustive]
82pub enum Protocol {
83    Http1,
84    Http2,
85    Http3,
86}
87
88type ConnectCallback<IO> = dyn Fn(&IO, &mut Extensions);
89
90#[derive(Default)]
95pub(crate) struct OnConnectData(Option<Extensions>);
96
97impl OnConnectData {
98    pub(crate) fn from_io<T>(io: &T, on_connect_ext: Option<&ConnectCallback<T>>) -> Self {
100        let ext = on_connect_ext.map(|handler| {
101            let mut extensions = Extensions::default();
102            handler(io, &mut extensions);
103            extensions
104        });
105
106        Self(ext)
107    }
108}