Http 3 Client request timeout not respected

Jaikiran Pai jaikiran.pai at oracle.com
Mon Nov 10 14:01:33 UTC 2025


Looking at the application code, the relevant parts appear to be this:

ServerConnectionConfig.builder()
         .maxIdleTimeoutInSeconds(50)
...
new Http3ApplicationProtocolFactory(
     (request, response) -> {
       try {
         Thread.sleep(Duration.ofSeconds(40));
       } catch (InterruptedException e) {
         Thread.interrupted();
       }
       response.setStatus(200);
...
HttpClient.newBuilder()
   .version(Version.valueOf("HTTP_3"))
   .sslContext(sslContext)
   .build()
   .send(
       HttpRequest.newBuilder()
           .timeout(Duration.ofSeconds(45))
           .uri(URI.create("https://localhost:8080"))
           .GET()

The server is configured to have a QUIC idle timeout of 50 seconds. On 
the client side, the JDK's HttpClient for HTTP/3 by default uses a idle 
timeout of 30 seconds. These timeouts translate to the QUIC connection 
level idle timeouts, which decide when to terminate the connection if 
there's no UDP traffic on that connection. The QUIC RFC specifies that 
each of the endpoints (the server and the client) can choose to 
advertise a idle timeout of their own, but the negotiated idle timeout 
will always be the lower of those two and that negotiated timeout must 
be honoured by both sides of the connection. So in this case, the server 
advertises 50 seconds and the client advertises 30 seconds, so the 30 
second timeout is the negotiated one for this connection and thus if the 
connection doesn't generate any traffic for that duration (like in this 
case), it gets idle terminated.

The default idle timeout for JDK's HttpClient can be configured using 
the "jdk.httpclient.keepalive.timeout.h3" system property 
https://download.java.net/java/early_access/jdk26/docs/api/java.net.http/module-summary.html. 
So setting it to -Djdk.httpclient.keepalive.timeout.h3=50 (for example), 
should then allow your application to stay idle without generating any 
UDP traffic for the QUIC connection for that long.

-Jaikiran

On 10/11/25 7:08 pm, Josiah Noel wrote:
> To emulate a few of my worst case latency scenarios that I have seen 
> in production, I have added a sleep with a thirty second timer before 
> I send a 200 status.
>
> Once more I have attached my jbang script as well as the extended logs 
> when I ran with 
> -Djdk.httpclient.HttpClient.log=requests,headers,errors,http3,quic:control:retransmit.
> -- 
> Cheers, Josiah.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mail.openjdk.org/pipermail/net-dev/attachments/20251110/a06a20f9/attachment-0001.htm>


More information about the net-dev mailing list