1#![doc = include_str!("../README.md")]
7#![doc(
8 html_favicon_url = "https://kura.pro/http-handle/images/favicon.ico",
9 html_logo_url = "https://kura.pro/http-handle/images/logos/http-handle.svg",
10 html_root_url = "https://docs.rs/http-handle"
11)]
12#![cfg_attr(docsrs, feature(doc_cfg))]
13#![cfg_attr(miri, allow(deprecated_in_future))]
14#![crate_name = "http_handle"]
15#![crate_type = "lib"]
16
17pub mod server;
18
19pub mod request;
20
21pub mod response;
22
23pub mod error;
24
25pub mod language;
26
27pub mod async_runtime;
28
29#[cfg(feature = "async")]
30#[cfg_attr(docsrs, doc(cfg(feature = "async")))]
31pub mod async_server;
32
33#[cfg(feature = "batch")]
34#[cfg_attr(docsrs, doc(cfg(feature = "batch")))]
35pub mod batch;
36
37#[cfg(feature = "streaming")]
38#[cfg_attr(docsrs, doc(cfg(feature = "streaming")))]
39pub mod streaming;
40
41#[cfg(feature = "optimized")]
42#[cfg_attr(docsrs, doc(cfg(feature = "optimized")))]
43pub mod optimized;
44
45#[cfg(feature = "http2")]
46#[cfg_attr(docsrs, doc(cfg(feature = "http2")))]
47pub mod http2_server;
48
49#[cfg(feature = "high-perf")]
50#[cfg_attr(docsrs, doc(cfg(feature = "high-perf")))]
51pub mod perf_server;
52
53#[cfg(feature = "http3-profile")]
54#[cfg_attr(docsrs, doc(cfg(feature = "http3-profile")))]
55pub mod http3_profile;
56
57#[cfg(feature = "distributed-rate-limit")]
58#[cfg_attr(docsrs, doc(cfg(feature = "distributed-rate-limit")))]
59pub mod distributed_rate_limit;
60
61#[cfg(feature = "multi-tenant")]
62#[cfg_attr(docsrs, doc(cfg(feature = "multi-tenant")))]
63pub mod tenant_isolation;
64
65#[cfg(feature = "autotune")]
66#[cfg_attr(docsrs, doc(cfg(feature = "autotune")))]
67pub mod runtime_autotune;
68
69pub mod protocol_state;
70
71#[cfg(feature = "enterprise")]
72#[cfg_attr(docsrs, doc(cfg(feature = "enterprise")))]
73pub mod enterprise;
74
75pub mod observability;
76
77pub use error::ServerError;
78pub use language::{Language, LanguageDetector};
79pub use server::{
80 ConnectionPool, Server, ServerBuilder, ShutdownSignal, ThreadPool,
81};
82
83#[cfg(all(test, miri))]
84mod miri_smoke {
85 use super::*;
86 use std::io::Cursor;
87
88 #[test]
89 fn response_serialization_smoke() {
90 let mut response =
91 response::Response::new(200, "OK", b"miri".to_vec());
92 response.add_header("Content-Type", "text/plain");
93 let mut out = Cursor::new(Vec::<u8>::new());
94 response.send(&mut out).expect("send");
95 assert!(!out.get_ref().is_empty());
96 }
97
98 #[test]
99 fn connection_pool_smoke() {
100 let pool = ConnectionPool::new(1);
101 let first = pool.acquire().expect("acquire");
102 assert_eq!(pool.active_count(), 1);
103 assert!(pool.acquire().is_err());
104 drop(first);
105 assert_eq!(pool.active_count(), 0);
106 }
107}