@@ -10,6 +10,7 @@ use pingora_core::upstreams::peer::HttpPeer;
1010use pingora_core:: Result as PingoraResult ;
1111use pingora_proxy:: { ProxyHttp , Session } ;
1212use pingora_http:: { RequestHeader , ResponseHeader } ;
13+ use pingora_core:: protocols:: tls:: server:: TlsAcceptor ;
1314use std:: sync:: Arc ;
1415use std:: collections:: HashMap ;
1516use parking_lot:: RwLock ;
@@ -460,6 +461,36 @@ impl ProxyHttp for PingclairProxy {
460461 fn new_ctx ( & self ) -> Self :: CTX {
461462 RequestCtx :: default ( )
462463 }
464+
465+ /// Resolve TLS certificate for SNI
466+ async fn resolve_tls_ctx (
467+ & self ,
468+ session : & mut Session ,
469+ ) -> pingora_core:: Result < Option < TlsAcceptor > > {
470+ if let Some ( tls_manager) = & self . tls_manager {
471+ let sni = session. get_header ( "Host" )
472+ . and_then ( |v| v. to_str ( ) . ok ( ) )
473+ . unwrap_or ( "" )
474+ . split ( ':' )
475+ . next ( )
476+ . unwrap_or ( "" ) ;
477+
478+ if sni. is_empty ( ) {
479+ return Ok ( None ) ;
480+ }
481+
482+ if let Some ( cert) = tls_manager. resolve_cert ( sni) . await {
483+ let acceptor = TlsAcceptor :: from_certified_key ( cert)
484+ . map_err ( |e| pingora_core:: Error :: because (
485+ pingora_core:: ErrorType :: TLSHandshakeFailure ,
486+ "Failed to create TlsAcceptor" ,
487+ e
488+ ) ) ?;
489+ return Ok ( Some ( acceptor) ) ;
490+ }
491+ }
492+ Ok ( None )
493+ }
463494
464495 /// Request filter (Handle static files and early return)
465496 async fn request_filter ( & self , session : & mut Session , ctx : & mut Self :: CTX ) -> pingora_core:: Result < bool > {
0 commit comments