RFR: 8331195: Improve com.sun.net.httpserver.HttpExchange usability [v4]
Ethan McCue
duke at openjdk.org
Wed May 1 23:07:56 UTC 2024
On Wed, 1 May 2024 21:12:05 GMT, robert engels <duke at openjdk.org> wrote:
>> improve the HttpExchange api with documented constants and convenience methods to avoid common bugs
>
> robert engels has updated the pull request incrementally with two additional commits since the last revision:
>
> - Merge remote-tracking branch 'robaho/HttpExchange-api-change' into HttpExchange-api-change
>
> # Conflicts:
> # src/jdk.httpserver/share/classes/com/sun/net/httpserver/HttpExchange.java
> - update api changes based on comments
I've doodled on this myself a little and one design that I think *might* have value is a `Body` interface.
interface Body {
OptionalInt contentLength(); // or sizeHint()
void writeTo(OutputStream os);
}
To illustrate why, consider this method
public final void sendResponse(int code,byte[] data) throws IOException {
sendResponseHeaders(code,data.length);
try (var os = getResponseBody()) {
os.write(data);
}
}
The first issue is that if `data.length` is 0 that starts a chunked transfer where what they'd really want to do is send the NO_CONTENT value of `-1`.
public final void sendResponse(int code,byte[] data) throws IOException {
sendResponseHeaders(code,data.length == 0 ? -1 : data.length);
try (var os = getResponseBody()) {
os.write(data);
}
}
And then there is the matter of the gap between sending headers and writing the body.
public final void sendResponse(int code,byte[] data) throws IOException {
sendResponseHeaders(code,data.length == 0 ? -1 : data.length);
data = new byte[] {};
try (var os = getResponseBody()) {
os.write(data);
}
}
Where hypothetically the assertion made when sending the headers can be invalidated by mistake.
Asking users to provide a body and boxing up that strangeness in there could be one approach. (Bikeshed on whether OptionalInt is appropriate - `ContentLength.of(123)`, `ContentLength.unknown()`, `ContentLength.of(0)` could be another option)
exchange.sendResponse(200, Body.of("Hello, world"));
try (var is = getClass().getResourceAsStream()) {
exchange.sendResponse(200, Body.of(is));
}
exchange.sendResponse(200, Body.empty());
-------------
PR Comment: https://git.openjdk.org/jdk/pull/18955#issuecomment-2089266766
More information about the net-dev
mailing list