actix_http/
lib.rs

1//! HTTP types and services for the Actix ecosystem.
2//!
3//! ## Crate Features
4//!
5//! | Feature             | Functionality                               |
6//! | ------------------- | ------------------------------------------- |
7//! | `http2`             | HTTP/2 support via [h2].                    |
8//! | `openssl`           | TLS support via [OpenSSL].                  |
9//! | `rustls-0_20`       | TLS support via rustls 0.20.                |
10//! | `rustls-0_21`       | TLS support via rustls 0.21.                |
11//! | `rustls-0_22`       | TLS support via rustls 0.22.                |
12//! | `rustls-0_23`       | TLS support via [rustls] 0.23.              |
13//! | `compress-brotli`   | Payload compression support: Brotli.        |
14//! | `compress-gzip`     | Payload compression support: Deflate, Gzip. |
15//! | `compress-zstd`     | Payload compression support: Zstd.          |
16//! | `trust-dns`         | Use [trust-dns] as the client DNS resolver. |
17//!
18//! [h2]: https://crates.io/crates/h2
19//! [OpenSSL]: https://crates.io/crates/openssl
20//! [rustls]: https://crates.io/crates/rustls
21//! [trust-dns]: https://crates.io/crates/trust-dns
22
23#![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/// A major HTTP protocol version.
80#[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/// Container for data that extract with ConnectCallback.
91///
92/// # Implementation Details
93/// Uses Option to reduce necessary allocations when merging with request extensions.
94#[derive(Default)]
95pub(crate) struct OnConnectData(Option<Extensions>);
96
97impl OnConnectData {
98    /// Construct by calling the on-connect callback with the underlying transport I/O.
99    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}