rest_api/api_http_server/
http.rs

1use std::convert::Infallible;
2use std::net::SocketAddr;
3use std::sync::Arc;
4use hyper::server::conn::AddrStream;
5use hyper::{Body, Request, Response, Server};
6use hyper::service::{make_service_fn, service_fn};
7
8use super::super::app::App;
9
10async fn handle(
11    context: Arc<App>,
12    addr: SocketAddr,
13    req: Request<Body>
14) -> Result<Response<Body>, Infallible> {
15    context.handle_http_request(req, addr).await
16}
17
18pub async fn run_app_server(addr: SocketAddr, app: App) {
19    let context = Arc::new(app);
20
21    // A `MakeService` that produces a `Service` to handle each connection.
22    let make_service = make_service_fn(move |conn: &AddrStream| {
23
24        let context = context.clone();
25
26        let addr = conn.remote_addr();
27
28        let service = service_fn(move |req| {
29            handle(context.clone(), addr, req)
30        });
31
32        async move { Ok::<_, Infallible>(service) }
33    });
34
35    let server = Server::bind(&addr).serve(make_service);
36
37    if let Err(e) = server.await {
38        log::error!("Server Panic: {}", e);
39    }
40}