static_web_server/
service.rs1use hyper::{Request, Response, body::Incoming, service::Service};
10use std::future::Future;
11use std::net::SocketAddr;
12use std::pin::Pin;
13use std::sync::Arc;
14
15use crate::{Error, body, handler::RequestHandler};
16
17#[cfg(feature = "metrics")]
18use crate::metrics;
19
20#[derive(Clone)]
22pub struct RouterService {
23 builder: RequestServiceBuilder,
24}
25
26impl RouterService {
27 pub fn new(handler: RequestHandler) -> Self {
29 Self {
30 builder: RequestServiceBuilder::new(handler),
31 }
32 }
33
34 pub fn build(&self, remote_addr: Option<SocketAddr>) -> RequestService {
36 self.builder.build(remote_addr)
37 }
38}
39
40pub struct RequestService {
42 handler: Arc<RequestHandler>,
43 remote_addr: Option<SocketAddr>,
44}
45
46impl RequestService {
47 fn new(handler: Arc<RequestHandler>, remote_addr: Option<SocketAddr>) -> Self {
48 #[cfg(feature = "metrics")]
49 metrics::inc_connections();
50 Self {
51 handler,
52 remote_addr,
53 }
54 }
55}
56
57#[cfg(feature = "metrics")]
58impl Drop for RequestService {
59 fn drop(&mut self) {
60 metrics::dec_connections();
61 }
62}
63
64impl Service<Request<Incoming>> for RequestService {
65 type Response = Response<body::Body>;
66 type Error = Error;
67 type Future =
68 Pin<Box<dyn Future<Output = Result<Response<body::Body>, Error>> + Send + 'static>>;
69
70 fn call(&self, mut req: Request<Incoming>) -> Self::Future {
71 let handler = self.handler.clone();
72 let remote_addr = self.remote_addr;
73 Box::pin(async move { handler.handle(&mut req, remote_addr).await })
74 }
75}
76
77#[derive(Clone)]
79pub struct RequestServiceBuilder {
80 handler: Arc<RequestHandler>,
81}
82
83impl RequestServiceBuilder {
84 pub fn new(handler: RequestHandler) -> Self {
86 Self {
87 handler: Arc::new(handler),
88 }
89 }
90
91 pub fn build(&self, remote_addr: Option<SocketAddr>) -> RequestService {
93 RequestService::new(self.handler.clone(), remote_addr)
94 }
95}