@@ -58,7 +58,7 @@ pub enum ServerError {
5858type App = NormalizePath < axum:: Router > ;
5959
6060/// Build the axum application with all routes and middleware.
61- fn make_app ( service : ServiceState ) -> App {
61+ fn make_app ( service : ServiceState , f : impl FnOnce ( & Config ) -> axum :: Router < ServiceState > ) -> App {
6262 // Build the router middleware into a single service which runs _after_ routing. Service
6363 // builder order defines layers added first will be called first. This means:
6464 // - Requests go from top to bottom
@@ -85,25 +85,14 @@ fn make_app(service: ServiceState) -> App {
8585 . compress_when ( SizeAbove :: new ( COMPRESSION_MIN_SIZE ) . and ( DefaultPredicate :: new ( ) ) ) ,
8686 ) ;
8787
88- let router = crate :: endpoints:: routes ( service. config ( ) )
89- . layer ( middleware)
90- . with_state ( service) ;
88+ let router = f ( service. config ( ) ) . layer ( middleware) . with_state ( service) ;
9189
9290 // Add middlewares that need to run _before_ routing, which need to wrap the router. This are
9391 // especially middlewares that modify the request path for the router:
9492 NormalizePath :: new ( router)
9593}
9694
97- fn listen ( config : & Config ) -> Result < TcpListener , ServerError > {
98- // Inform the user about a removed feature.
99- if config. tls_listen_addr ( ) . is_some ( )
100- || config. tls_identity_password ( ) . is_some ( )
101- || config. tls_identity_path ( ) . is_some ( )
102- {
103- return Err ( ServerError :: TlsNotSupported ) ;
104- }
105-
106- let addr = config. listen_addr ( ) ;
95+ fn listen ( addr : SocketAddr , config : & Config ) -> Result < TcpListener , ServerError > {
10796 let socket = match addr {
10897 SocketAddr :: V4 ( _) => TcpSocket :: new_v4 ( ) ,
10998 SocketAddr :: V6 ( _) => TcpSocket :: new_v6 ( ) ,
@@ -115,7 +104,7 @@ fn listen(config: &Config) -> Result<TcpListener, ServerError> {
115104 Ok ( socket. listen ( config. tcp_listen_backlog ( ) ) ?. into_std ( ) ?)
116105}
117106
118- async fn serve ( listener : TcpListener , app : App , config : Arc < Config > ) {
107+ async fn serve ( listener : TcpListener , app : App , config : & Config ) -> std :: io :: Result < ( ) > {
119108 let handle = Handle :: new ( ) ;
120109
121110 let acceptor = self :: acceptor:: RelayAcceptor :: new ( )
@@ -162,10 +151,7 @@ async fn serve(listener: TcpListener, app: App, config: Arc<Config>) {
162151 }
163152 } ) ;
164153
165- server
166- . serve ( service)
167- . await
168- . expect ( "failed to start axum server" ) ;
154+ server. serve ( service) . await
169155}
170156
171157/// HTTP server service.
@@ -176,16 +162,30 @@ pub struct HttpServer {
176162 config : Arc < Config > ,
177163 service : ServiceState ,
178164 listener : TcpListener ,
165+ internal_listener : Option < TcpListener > ,
179166}
180167
181168impl HttpServer {
182169 pub fn new ( config : Arc < Config > , service : ServiceState ) -> Result < Self , ServerError > {
183- let listener = listen ( & config) ?;
170+ // Inform the user about a removed feature.
171+ if config. tls_listen_addr ( ) . is_some ( )
172+ || config. tls_identity_password ( ) . is_some ( )
173+ || config. tls_identity_path ( ) . is_some ( )
174+ {
175+ return Err ( ServerError :: TlsNotSupported ) ;
176+ }
177+
178+ let listener = listen ( config. listen_addr ( ) , & config) ?;
179+ let internal_listener = match config. listen_addr_internal ( ) {
180+ Some ( addr) => Some ( listen ( addr, & config) ?) ,
181+ None => None ,
182+ } ;
184183
185184 Ok ( Self {
186185 config,
187186 service,
188187 listener,
188+ internal_listener,
189189 } )
190190 }
191191}
@@ -198,14 +198,32 @@ impl Service for HttpServer {
198198 config,
199199 service,
200200 listener,
201+ internal_listener,
201202 } = self ;
202203
204+ let listen_addr = config. listen_addr ( ) ;
205+
203206 relay_log:: info!( "spawning http server" ) ;
204- relay_log:: info!( " listening on http://{}/" , config. listen_addr( ) ) ;
207+ relay_log:: info!( " listening on http://{listen_addr}/" ) ;
208+ if let Some ( internal_addr) = config. listen_addr_internal ( ) {
209+ relay_log:: info!( " listening on http://{internal_addr}/ [internal]" ) ;
210+ }
205211 relay_statsd:: metric!( counter( RelayCounters :: ServerStarting ) += 1 ) ;
206212
207- let app = make_app ( service) ;
208- serve ( listener, app, config) . await ;
213+ if let Some ( internal_listener) = internal_listener {
214+ let public = make_app ( service. clone ( ) , crate :: endpoints:: public_routes) ;
215+ let internal = make_app ( service, crate :: endpoints:: internal_routes) ;
216+
217+ tokio:: try_join!(
218+ serve( listener, public, & config) ,
219+ serve( internal_listener, internal, & config) ,
220+ )
221+ . map ( drop)
222+ } else {
223+ let app = make_app ( service, crate :: endpoints:: all_routes) ;
224+ serve ( listener, app, & config) . await
225+ }
226+ . expect ( "axum listener to not fail" )
209227 }
210228}
211229
@@ -214,10 +232,13 @@ async fn emit_active_connections_metric(interval: Option<Duration>, handle: Hand
214232 return ;
215233 } ;
216234
235+ let addr = handle. listening ( ) . await . map ( |addr| addr. to_string ( ) ) ;
236+
217237 loop {
218238 ticker. tick ( ) . await ;
219239 relay_statsd:: metric!(
220- gauge( RelayGauges :: ServerActiveConnections ) = handle. connection_count( ) as u64
240+ gauge( RelayGauges :: ServerActiveConnections ) = handle. connection_count( ) as u64 ,
241+ addr = addr. as_deref( ) . unwrap_or( "unknown" ) ,
221242 ) ;
222243 }
223244}
0 commit comments