(
subsys: SubsystemHandle,
connection_tracker: TaskTracker,
tls_config: ServerConfig,
proxy_addr: SocketAddr,
runtime_addr: SocketAddr,
)
| 303 | } |
| 304 | |
| 305 | async fn start_tls_proxy( |
| 306 | subsys: SubsystemHandle, |
| 307 | connection_tracker: TaskTracker, |
| 308 | tls_config: ServerConfig, |
| 309 | proxy_addr: SocketAddr, |
| 310 | runtime_addr: SocketAddr, |
| 311 | ) -> Result<()> { |
| 312 | info!( |
| 313 | ?proxy_addr, |
| 314 | "starting TLS server, use this address to send secure requests to the runtime" |
| 315 | ); |
| 316 | |
| 317 | let acceptor = TlsAcceptor::from(Arc::new(tls_config)); |
| 318 | |
| 319 | let listener = TcpListener::bind(proxy_addr).await.into_diagnostic()?; |
| 320 | |
| 321 | let addr = Arc::new(runtime_addr); |
| 322 | |
| 323 | loop { |
| 324 | let (stream, _) = listener.accept().await.into_diagnostic()?; |
| 325 | let acceptor = acceptor.clone(); |
| 326 | |
| 327 | let addr = addr.clone(); |
| 328 | |
| 329 | connection_tracker.spawn({ |
| 330 | let cancellation_token = subsys.create_cancellation_token(); |
| 331 | let connection_tracker = connection_tracker.clone(); |
| 332 | |
| 333 | async move { |
| 334 | let hyper_service = service_fn(move |request: Request<Incoming>| { |
| 335 | proxy(connection_tracker.clone(), request, addr.clone()) |
| 336 | }); |
| 337 | |
| 338 | let tls_stream = match acceptor.accept(stream).await { |
| 339 | Ok(tls_stream) => tls_stream, |
| 340 | Err(e) => { |
| 341 | error!(error = ?e, "Failed to accept TLS connection"); |
| 342 | return Err(e).into_diagnostic(); |
| 343 | } |
| 344 | }; |
| 345 | |
| 346 | let builder = Builder::new(TokioExecutor::new()); |
| 347 | let conn = builder.serve_connection(TokioIo::new(tls_stream), hyper_service); |
| 348 | |
| 349 | pin!(conn); |
| 350 | |
| 351 | let result = tokio::select! { |
| 352 | res = conn.as_mut() => res, |
| 353 | _ = cancellation_token.cancelled() => { |
| 354 | conn.as_mut().graceful_shutdown(); |
| 355 | conn.await |
| 356 | } |
| 357 | }; |
| 358 | |
| 359 | if let Err(e) = result { |
| 360 | error!(error = ?e, "Failed to serve connection"); |
| 361 | } |
| 362 |
no test coverage detected