use pingora_core::services::listening::Service;
use praxis_core::ProxyError;
use tracing::info;
use super::proxy::PingoraTcpProxy;
pub(super) fn register_tcp_listeners(
service: &mut Service<PingoraTcpProxy>,
listeners: &[&praxis_core::config::Listener],
upstream: Option<&str>,
) -> Result<Vec<tokio::sync::watch::Sender<bool>>, ProxyError> {
let display_upstream = upstream.unwrap_or("filter-routed");
let mut shutdown_senders = Vec::new();
for listener in listeners {
if let Some(tls) = &listener.tls {
let (tls_settings, watcher_shutdown) = build_tcp_tls_settings(tls, &listener.address)?;
if let Some(tx) = watcher_shutdown {
shutdown_senders.push(tx);
}
service.add_tls_with_settings(&listener.address, None, tls_settings);
} else {
service.add_tcp(&listener.address);
}
info!(
name = %listener.name,
address = %listener.address,
upstream = %display_upstream,
"TCP listener registered"
);
}
Ok(shutdown_senders)
}
fn build_tcp_tls_settings(
tls: &praxis_tls::ListenerTls,
address: &str,
) -> Result<
(
pingora_core::listeners::tls::TlsSettings,
Option<tokio::sync::watch::Sender<bool>>,
),
ProxyError,
> {
crate::tls_setup::build_tls_settings(tls, address, "TCP", false)
}