Skip to main content

http_handle/
lib.rs

1// SPDX-License-Identifier: AGPL-3.0-only
2// Copyright (c) 2026 Sebastien Rousseau
3
4// src/lib.rs
5
6#![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}