Loading debian/changelog +27 −0 Original line number Diff line number Diff line libhttppp (20260718+11) unstable; urgency=high * HttpUrl: track the original URL scheme (http/https) separately from _protocol, which the http3=true constructor flag permanently pins to HTTP3. Add HttpUrl::getOriginalProtocol() for the fallback decisions below, which need to know the actual scheme regardless of that flag. * HttpClient: fix HTTP/3 clients constructed against a non-QUIC endpoint (e.g. mediadb::Client(url, ..., /*http3=*/true) against a plain HTTP server) always failing outright instead of falling back to HTTP/1.1. tryHttp3First() correctly detected and cached the QUIC failure, but the ctor's own fallback-strategy check (getProtocol() == HTTPS, meant to tell "try HTTP/2 next" apart from "go cleartext") could never see HTTPS once http3=true had pinned that field to HTTP3, so cleartext targets always fell into the cleartext branch and called resetConnection() -- which re-derived the transport from that same permanently-HTTP3 field and re-entered the QUIC branch a second time. That second attempt runs quic::connect() in blocking mode with no surrounding try/catch, so it blocks for the full 5s handshake timeout and then throws instead of falling back, surfacing on every request as "HttpClient ctor connect failed: quic::completeHandshake: handshake timed out". resetConnection() and reconnect() now only take the QUIC branch when _vers == 3 (HTTP/3 is still what's wanted, not a downgraded fallback attempt), and choose between TLS and plain TCP based on the URL's original scheme instead of the pinned field. -- Jan Koester <jan.koester@tuxist.de> Sat, 18 Jul 2026 14:50:00 +0200 libhttppp (20260707+10) unstable; urgency=medium * HttpEvent::_resumeH2Streams: on a genuine upstream stall (emptyCount > Loading Loading
debian/changelog +27 −0 Original line number Diff line number Diff line libhttppp (20260718+11) unstable; urgency=high * HttpUrl: track the original URL scheme (http/https) separately from _protocol, which the http3=true constructor flag permanently pins to HTTP3. Add HttpUrl::getOriginalProtocol() for the fallback decisions below, which need to know the actual scheme regardless of that flag. * HttpClient: fix HTTP/3 clients constructed against a non-QUIC endpoint (e.g. mediadb::Client(url, ..., /*http3=*/true) against a plain HTTP server) always failing outright instead of falling back to HTTP/1.1. tryHttp3First() correctly detected and cached the QUIC failure, but the ctor's own fallback-strategy check (getProtocol() == HTTPS, meant to tell "try HTTP/2 next" apart from "go cleartext") could never see HTTPS once http3=true had pinned that field to HTTP3, so cleartext targets always fell into the cleartext branch and called resetConnection() -- which re-derived the transport from that same permanently-HTTP3 field and re-entered the QUIC branch a second time. That second attempt runs quic::connect() in blocking mode with no surrounding try/catch, so it blocks for the full 5s handshake timeout and then throws instead of falling back, surfacing on every request as "HttpClient ctor connect failed: quic::completeHandshake: handshake timed out". resetConnection() and reconnect() now only take the QUIC branch when _vers == 3 (HTTP/3 is still what's wanted, not a downgraded fallback attempt), and choose between TLS and plain TCP based on the URL's original scheme instead of the pinned field. -- Jan Koester <jan.koester@tuxist.de> Sat, 18 Jul 2026 14:50:00 +0200 libhttppp (20260707+10) unstable; urgency=medium * HttpEvent::_resumeH2Streams: on a genuine upstream stall (emptyCount > Loading