static_web_server/
service.rs
1use hyper::{service::Service, Body, Request, Response};
10use std::convert::Infallible;
11use std::future::{ready, Future, Ready};
12use std::net::SocketAddr;
13use std::pin::Pin;
14use std::sync::Arc;
15use std::task::{Context, Poll};
16
17use crate::{handler::RequestHandler, transport::Transport, Error};
18
19pub struct RouterService {
21 builder: RequestServiceBuilder,
22}
23
24impl RouterService {
25 pub fn new(handler: RequestHandler) -> Self {
27 Self {
28 builder: RequestServiceBuilder::new(handler),
29 }
30 }
31}
32
33impl<T: Transport + Send + 'static> Service<&T> for RouterService {
34 type Response = RequestService;
35 type Error = Infallible;
36 type Future = Ready<Result<Self::Response, Self::Error>>;
37
38 fn poll_ready(&mut self, _: &mut Context<'_>) -> Poll<Result<(), Self::Error>> {
39 Poll::Ready(Ok(()))
40 }
41
42 fn call(&mut self, conn: &T) -> Self::Future {
43 ready(Ok(self.builder.build(conn.remote_addr())))
44 }
45}
46
47pub struct RequestService {
49 handler: Arc<RequestHandler>,
50 remote_addr: Option<SocketAddr>,
51}
52
53impl Service<Request<Body>> for RequestService {
54 type Response = Response<Body>;
55 type Error = Error;
56 type Future = Pin<Box<dyn Future<Output = Result<Response<Body>, Error>> + Send + 'static>>;
57
58 fn poll_ready(&mut self, _: &mut Context<'_>) -> Poll<Result<(), Error>> {
59 Poll::Ready(Ok(()))
60 }
61
62 fn call(&mut self, mut req: Request<Body>) -> Self::Future {
63 let handler = self.handler.clone();
64 let remote_addr = self.remote_addr;
65 Box::pin(async move { handler.handle(&mut req, remote_addr).await })
66 }
67}
68
69pub struct RequestServiceBuilder {
71 handler: Arc<RequestHandler>,
72}
73
74impl RequestServiceBuilder {
75 pub fn new(handler: RequestHandler) -> Self {
77 Self {
78 handler: Arc::new(handler),
79 }
80 }
81
82 pub fn build(&self, remote_addr: Option<SocketAddr>) -> RequestService {
84 RequestService {
85 handler: self.handler.clone(),
86 remote_addr,
87 }
88 }
89}