Skip to main content

rust_web_server/
lib.rs

1//! # rust-web-server
2//!
3//! A static file web server and HTTP toolkit written in Rust.
4//! Supports HTTP/3 (QUIC), HTTP/2, and HTTP/1.1.
5//!
6//! ## Use as a library
7//!
8//! Add to `Cargo.toml`:
9//!
10//! ```toml
11//! [dependencies]
12//! rust-web-server = "17"
13//! ```
14//!
15//! ## Quick start: add a custom route
16//!
17//! ```rust,no_run
18//! use rust_web_server::controller::Controller;
19//! use rust_web_server::request::{METHOD, Request};
20//! use rust_web_server::response::{Response, STATUS_CODE_REASON_PHRASE};
21//! use rust_web_server::range::Range;
22//! use rust_web_server::mime_type::MimeType;
23//! use rust_web_server::server::ConnectionInfo;
24//!
25//! pub struct PingController;
26//!
27//! impl Controller for PingController {
28//!     fn is_matching(request: &Request, _: &ConnectionInfo) -> bool {
29//!         request.method == METHOD.get && request.request_uri == "/ping"
30//!     }
31//!
32//!     fn process(_: &Request, mut response: Response, _: &ConnectionInfo) -> Response {
33//!         response.status_code = *STATUS_CODE_REASON_PHRASE.n200_ok.status_code;
34//!         response.reason_phrase = STATUS_CODE_REASON_PHRASE.n200_ok.reason_phrase.to_string();
35//!         response.content_range_list = vec![
36//!             Range::get_content_range(b"pong".to_vec(), MimeType::TEXT_PLAIN.to_string())
37//!         ];
38//!         response
39//!     }
40//! }
41//! ```
42//!
43//! See [DEVELOPER.md](https://github.com/bohdaq/rust-web-server/blob/main/DEVELOPER.md)
44//! for the full building blocks reference and use case examples.
45
46// Allows `::rust_web_server::…` paths to resolve from within this crate's own
47// tests, which is required by proc-macro derive output that uses that prefix.
48extern crate self as rust_web_server;
49
50pub mod app;
51#[cfg(feature = "auth")]
52pub mod auth;
53
54#[cfg(feature = "macros")]
55pub use rws_macros::{delete, get, patch, post, put, route, Config, FromRequest, Validate};
56#[cfg(all(feature = "macros", any(feature = "model-sqlite", feature = "model-postgres", feature = "model-mysql")))]
57pub use rws_macros::Model;
58#[cfg(feature = "http2")]
59pub mod async_state;
60pub mod session;
61pub mod sse;
62pub mod compression;
63pub mod cookie;
64pub mod error;
65pub mod extract;
66pub mod ip_filter;
67pub mod macros;
68pub mod blocklist;
69pub mod cache;
70pub mod config_reload;
71pub mod server_config;
72pub mod feature;
73pub mod maintenance;
74pub mod metrics;
75pub mod mcp;
76pub mod request_log;
77pub mod request_id;
78pub mod otel;
79#[cfg(feature = "acme")]
80pub mod acme;
81pub mod middleware;
82pub mod rate_limit;
83pub mod router;
84pub mod state;
85pub mod test_client;
86pub mod application;
87pub mod body;
88pub mod client_hint;
89pub mod controller;
90pub mod core;
91pub mod cors;
92pub mod entry_point;
93pub mod ext;
94pub mod header;
95pub mod http;
96pub mod json;
97pub mod language;
98pub mod log;
99pub mod mime_type;
100pub mod null;
101pub mod range;
102pub mod request;
103pub mod response;
104pub mod server;
105pub mod symbol;
106pub mod thread_pool;
107pub mod url;
108pub mod proxy;
109pub mod rewrite;
110pub mod scheduler;
111pub mod tcp_proxy;
112pub mod udp_proxy;
113pub mod ws_proxy;
114pub mod canary;
115pub mod circuit_breaker;
116pub mod service_discovery;
117pub mod config_binding;
118pub mod di;
119pub mod proxy_config;
120pub mod ingress;
121#[cfg(feature = "tera")]
122pub mod template;
123pub mod validate;
124pub mod virtual_host;
125#[cfg(any(feature = "model-sqlite", feature = "model-postgres", feature = "model-mysql"))]
126pub mod model;
127pub mod websocket;
128pub mod http_client;
129#[cfg(feature = "crypto")]
130pub mod crypto;
131#[cfg(feature = "csrf")]
132pub mod csrf;
133#[cfg(feature = "sso")]
134pub mod sso;
135#[cfg(feature = "mailer")]
136pub mod mailer;
137#[cfg(feature = "jobs")]
138pub mod jobs;
139#[cfg(any(feature = "storage-local", feature = "storage-s3"))]
140pub mod storage;
141#[cfg(feature = "openapi")]
142pub mod openapi;
143pub mod timeout;
144pub mod prelude;
145
146#[cfg(feature = "http2")]
147#[doc(hidden)]
148pub mod tls;
149
150#[cfg(feature = "http2")]
151#[doc(hidden)]
152pub mod h2_handler;
153
154#[cfg(feature = "http3")]
155#[doc(hidden)]
156pub mod h3_handler;
157
158/// Shared infrastructure for tests that write process-wide environment variables.
159///
160/// Tests that call `override_environment_variables_from_config` or
161/// `CommandLineArgument::set_environment_variable` must hold this lock for
162/// their entire duration so they don't race with other tests reading the
163/// same variables.
164#[cfg(test)]
165pub mod test_env {
166    use std::sync::{Mutex, OnceLock};
167    static LOCK: OnceLock<Mutex<()>> = OnceLock::new();
168    pub fn lock() -> std::sync::MutexGuard<'static, ()> {
169        LOCK.get_or_init(|| Mutex::new(()))
170            .lock()
171            .unwrap_or_else(|e| e.into_inner())
172    }
173}