Skip to content

Commit e3c2d23

Browse files
committed
fix: implement resolve_tls_ctx for HTTPS support 🔐🦀
1 parent 7d41a2d commit e3c2d23

1 file changed

Lines changed: 31 additions & 0 deletions

File tree

pingclair-proxy/src/server.rs

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ use pingora_core::upstreams::peer::HttpPeer;
1010
use pingora_core::Result as PingoraResult;
1111
use pingora_proxy::{ProxyHttp, Session};
1212
use pingora_http::{RequestHeader, ResponseHeader};
13+
use pingora_core::protocols::tls::server::TlsAcceptor;
1314
use std::sync::Arc;
1415
use std::collections::HashMap;
1516
use 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

Comments
 (0)