RFR: 6968351: httpserver clashes with delayed TCP ACKs for low Content-Length

Daniel Jeliński djelinski at openjdk.org
Fri Apr 19 09:57:10 UTC 2024


On Sat, 6 Apr 2024 23:35:48 GMT, robert engels <duke at openjdk.org> wrote:

> fix bug JDK-B6968351 by avoiding flush after response headers

This is not as complex as I expected it to be. Which is a good thing!

Some tests are failing with this change. See:

test/jdk/sun/net/www/http/KeepAliveCache/B8293562.java
test/jdk/java/net/Authenticator/B4769350.java

These tests don't close the exchange or the output stream after sending the response, and the headers are never flushed. Users might have similar code, so I think a release note might be needed.

src/jdk.httpserver/share/classes/sun/net/httpserver/ServerImpl.java line 39:

> 37: import javax.net.ssl.SSLContext;
> 38: import javax.net.ssl.SSLEngine;
> 39: import java.io.*;

Please do not use wildcard imports in this file.

test/jdk/com/sun/net/httpserver/bugs/B6968351.java line 30:

> 28:  * @library /test/lib
> 29:  * @run main B6968351
> 30:  * @run main/othervm -Dsun.net.httpserver.nodelay=false -Djdk.httpclient.HttpClient.log=all -Djava.net.preferIPv6Addresses=true -Djavax.net.debug=all B6968351

Do you need all these system properties here?

test/jdk/com/sun/net/httpserver/bugs/B6968351.java line 45:

> 43: import java.util.logging.*;
> 44: 
> 45: public class B6968351 {

You could use a more revealing name here; the B<bug numer> aren't very useful

test/jdk/com/sun/net/httpserver/bugs/B6968351.java line 75:

> 73:         long time = System.currentTimeMillis()-start;
> 74:         System.out.println("time "+time);
> 75:         if(time>5000) throw new IllegalStateException("took too long");

Use jtreg timeout instead, like:

@run main/timeout=5 B6968351

(the timeout value is in seconds, but it's scaled x4 by default)

this will interrupt the test if/when the timeout is hit, and will also enable scaling the timeout on slower machines

test/jdk/com/sun/net/httpserver/bugs/B6968351.java line 90:

> 88:             is.close();
> 89:             rmap.add("content-type","text/plain");
> 90:             t.sendResponseHeaders(200,5);

if I read the code correctly, there might be a similar delay when sending the last chunk of a chunked response. Would you like to fix it here as well? If not, we can file another ticket for it.

In order to send a chunked response, change the second parameter to `0` here.

test/jdk/com/sun/net/httpserver/bugs/B6968351.java line 91:

> 89:             rmap.add("content-type","text/plain");
> 90:             t.sendResponseHeaders(200,5);
> 91:             t.getResponseBody().write("hello".getBytes());

Suggestion:

            t.getResponseBody().write("hello".getBytes(StandardCharsets.ISO_8859_1));

-------------

PR Review: https://git.openjdk.org/jdk/pull/18667#pullrequestreview-2010884813
PR Review Comment: https://git.openjdk.org/jdk/pull/18667#discussion_r1572046765
PR Review Comment: https://git.openjdk.org/jdk/pull/18667#discussion_r1572048695
PR Review Comment: https://git.openjdk.org/jdk/pull/18667#discussion_r1572121432
PR Review Comment: https://git.openjdk.org/jdk/pull/18667#discussion_r1572052902
PR Review Comment: https://git.openjdk.org/jdk/pull/18667#discussion_r1572123627
PR Review Comment: https://git.openjdk.org/jdk/pull/18667#discussion_r1572059622


More information about the net-dev mailing list