fix(rustproxy-http): prevent premature idle timeouts during streamed HTTP responses and ensure TLS close_notify is sent on dropped connections

This commit is contained in:
2026-03-16 08:58:11 +00:00
parent 0475e6b442
commit b3d4949225
7 changed files with 146 additions and 4 deletions

View File

@@ -1014,7 +1014,11 @@ impl TcpListenerManager {
"TLS Terminate + HTTP: {} -> {}:{} (domain: {:?})",
peer_addr, target_host, target_port, domain
);
http_proxy.handle_io(buf_stream, peer_addr, port, cancel.clone()).await;
// Wrap in ShutdownOnDrop to ensure TLS close_notify is sent
// even if hyper drops the connection without calling shutdown
// (e.g. H2 close, backend error, idle timeout drain).
let wrapped = rustproxy_http::shutdown_on_drop::ShutdownOnDrop::new(buf_stream);
http_proxy.handle_io(wrapped, peer_addr, port, cancel.clone()).await;
} else {
debug!(
"TLS Terminate + TCP: {} -> {}:{} (domain: {:?})",
@@ -1096,7 +1100,10 @@ impl TcpListenerManager {
"TLS Terminate+Reencrypt + HTTP: {} (domain: {:?})",
peer_addr, domain
);
http_proxy.handle_io(buf_stream, peer_addr, port, cancel.clone()).await;
// Wrap in ShutdownOnDrop to ensure TLS close_notify is sent
// even if hyper drops the connection without calling shutdown.
let wrapped = rustproxy_http::shutdown_on_drop::ShutdownOnDrop::new(buf_stream);
http_proxy.handle_io(wrapped, peer_addr, port, cancel.clone()).await;
} else {
// Non-HTTP: TLS-to-TLS tunnel (existing behavior for raw TCP protocols)
debug!(