add timeout as a the tower layer

This commit is contained in:
Bryan Stitt 2023-07-19 18:41:26 -07:00
parent c77f1e04b1
commit e6dc64f369

@ -13,8 +13,9 @@ pub mod users;
use crate::app::Web3ProxyApp; use crate::app::Web3ProxyApp;
use crate::errors::Web3ProxyResult; use crate::errors::Web3ProxyResult;
use axum::{ use axum::{
error_handling::HandleErrorLayer,
routing::{get, post}, routing::{get, post},
Extension, Router, BoxError, Extension, Router,
}; };
use http::{header::AUTHORIZATION, Request, StatusCode}; use http::{header::AUTHORIZATION, Request, StatusCode};
use hyper::Body; use hyper::Body;
@ -25,6 +26,8 @@ use std::{iter::once, time::Duration};
use std::{net::SocketAddr, sync::atomic::Ordering}; use std::{net::SocketAddr, sync::atomic::Ordering};
use strum::{EnumCount, EnumIter}; use strum::{EnumCount, EnumIter};
use tokio::sync::broadcast; use tokio::sync::broadcast;
use tower::timeout::TimeoutLayer;
use tower::ServiceBuilder;
use tower_http::sensitive_headers::SetSensitiveRequestHeadersLayer; use tower_http::sensitive_headers::SetSensitiveRequestHeadersLayer;
use tower_http::{cors::CorsLayer, trace::TraceLayer}; use tower_http::{cors::CorsLayer, trace::TraceLayer};
use tracing::{error_span, info}; use tracing::{error_span, info};
@ -261,6 +264,17 @@ pub async fn serve(
.layer(Extension(app.clone())) .layer(Extension(app.clone()))
// frontend caches // frontend caches
.layer(Extension(Arc::new(response_cache))) .layer(Extension(Arc::new(response_cache)))
// request timeout
.layer(
ServiceBuilder::new()
// this middleware goes above `TimeoutLayer` because it will receive
// errors returned by `TimeoutLayer`
// TODO: JsonRPC error response
.layer(HandleErrorLayer::new(|_: BoxError| async {
StatusCode::REQUEST_TIMEOUT
}))
.layer(TimeoutLayer::new(Duration::from_secs(5 * 60))),
)
// request id // request id
.layer( .layer(
TraceLayer::new_for_http().make_span_with(|request: &Request<Body>| { TraceLayer::new_for_http().make_span_with(|request: &Request<Body>| {