rest_api/api_http_server/
http.rs1use 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 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}