Line data Source code
1 : use anyhow::{anyhow, bail};
2 : use hyper::{Body, Request, Response, StatusCode};
3 : use std::{convert::Infallible, net::TcpListener};
4 : use tracing::info;
5 : use utils::http::{
6 : endpoint::{self, prometheus_metrics_handler, request_span},
7 : error::ApiError,
8 : json::json_response,
9 : RouterBuilder, RouterService,
10 : };
11 :
12 0 : async fn status_handler(_: Request<Body>) -> Result<Response<Body>, ApiError> {
13 0 : json_response(StatusCode::OK, "")
14 0 : }
15 :
16 0 : fn make_router() -> RouterBuilder<hyper::Body, ApiError> {
17 0 : endpoint::make_router()
18 0 : .get("/metrics", |r| request_span(r, prometheus_metrics_handler))
19 0 : .get("/v1/status", status_handler)
20 0 : }
21 :
22 0 : pub async fn task_main(http_listener: TcpListener) -> anyhow::Result<Infallible> {
23 0 : scopeguard::defer! {
24 0 : info!("http has shut down");
25 : }
26 :
27 0 : let service = || RouterService::new(make_router().build()?);
28 :
29 0 : hyper::Server::from_tcp(http_listener)?
30 0 : .serve(service().map_err(|e| anyhow!(e))?)
31 0 : .await?;
32 :
33 0 : bail!("hyper server without shutdown handling cannot shutdown successfully");
34 0 : }
|