Skip to main content

nimble_http/
server.rs

1//! server.rs
2use crate::Router;
3use hyper::server::{Server, conn::AddrStream};
4use hyper::service::{make_service_fn, service_fn};
5use std::net::SocketAddr;
6use std::sync::Arc;
7
8impl Router {
9	/// 启动 HTTP 服务器
10	pub async fn run(self, host: &str, port: u16) {
11		let addr: SocketAddr = format!("{}:{}", host, port)
12			.parse()
13			.expect("invalid socket address: invalid IP address syntax");
14		
15		let enable_logger = self.enable_logger;
16		let router = Arc::new(self);
17
18		let make_svc = make_service_fn(move |conn: &AddrStream| {
19			// 保留 conn
20			let remote_addr = conn.remote_addr(); // 获取客户端 IP
21			let router = router.clone();
22
23			async move {
24				Ok::<_, hyper::Error>(service_fn(move |mut req| {
25					// 注意 mut req
26					// 注入 IP 到 extensions
27					req.extensions_mut().insert(remote_addr);
28					let router = router.clone();
29					async move { Ok::<_, hyper::Error>(router.handle_request(req).await) }
30				}))
31			}
32		});
33
34		let server = Server::bind(&addr).serve(make_svc);
35
36		if enable_logger {
37			println!("Nimble server running on http://{}", addr);
38			println!("Press Ctrl+C to stop");
39		}
40
41		if let Err(e) = server.await {
42			eprintln!("Server error: {}", e);
43		}
44	}
45}