public final class HttpHandlers extends Object
HttpHandler
that implement various useful handlers, such as a static response handler, or a conditional handler that complements one handler with another. The factory method of(int, Headers, String)
provides a means to create handlers with pre-set static response state. For example, a jsonHandler
that always returns 200 with the same json:
HttpHandlers.of(200,
Headers.of("Content-Type", "application/json"),
Files.readString(Path.of("some.json")));
or a notAllowedHandler
that always replies with 405 - Method Not Allowed, and indicates the set of methods that are allowed:
HttpHandlers.of(405, Headers.of("Allow", "GET"), "");
The functionality of a handler can be extended or enhanced through the use of handleOrElse
, which allows to complement a given handler. For example, complementing a jsonHandler
with notAllowedHandler:
Predicate<Request> IS_GET = r -> r.getRequestMethod().equals("GET");
var handler = HttpHandlers.handleOrElse(IS_GET, jsonHandler, notAllowedHandler);
The above handleOrElse handler
offers an if-else like construct; if the request method is "GET" then handling of the exchange is delegated to the jsonHandler
, otherwise handling of the exchange is delegated to the notAllowedHandler
.Modifier and Type | Method | Description |
---|---|---|
static HttpHandler |
handleOrElse |
Complements a conditional HttpHandler with another handler. |
static HttpHandler |
of |
Returns an HttpHandler that sends a response comprising the given statusCode , headers , and body . |
public static HttpHandler handleOrElse(Predicate<Request> handlerTest, HttpHandler handler, HttpHandler fallbackHandler)
HttpHandler
with another handler. This method creates a handleOrElse handler; an if-else like construct. Exchanges who's request matches the handlerTest
predicate are handled by the handler
. All remaining exchanges are handled by the fallbackHandler
.
Example of a nested handleOrElse handler:
Predicate<Request> IS_GET = r -> r.getRequestMethod().equals("GET");
Predicate<Request> WANTS_DIGEST = r -> r.getRequestHeaders().containsKey("Want-Digest");
var h1 = new SomeHandler();
var h2 = HttpHandlers.handleOrElse(IS_GET, new SomeGetHandler(), h1);
var h3 = HttpHandlers.handleOrElse(WANTS_DIGEST.and(IS_GET), new SomeDigestHandler(), h2);
The h3
handleOrElse handler delegates handling of the exchange to SomeDigestHandler
if the "Want-Digest" request header is present and the request method is GET
, otherwise it delegates handling of the exchange to the h2
handler. The h2
handleOrElse handler, in turn, delegates handling of the exchange to
SomeGetHandler
if the request method is GET
, otherwise it delegates handling of the exchange to the h1
handler. The
h1
handler handles all exchanges that are not previously delegated to either SomeGetHandler
or SomeDigestHandler
.handlerTest
- a request predicatehandler
- a conditional handlerfallbackHandler
- a fallback handlerNullPointerException
- if any argument is nullpublic static HttpHandler of(int statusCode, Headers headers, String body)
HttpHandler
that sends a response comprising the given statusCode
, headers
, and body
. This method creates a handler that reads and discards the request body before it sets the response state and sends the response.
headers
are the effective headers of the response. The response body bytes are a UTF-8
encoded byte sequence of body
. The response headers are sent with the given statusCode
and the body bytes' length (or -1
if the body is empty). The body bytes are then sent as response body, unless the body is empty, in which case no response body is sent.
statusCode
- a response status codeheaders
- a headersbody
- a response body stringIllegalArgumentException
- if statusCode is not a positive 3-digit integer, as per rfc2616, section 6.1.1NullPointerException
- if headers or body are null
© 1993, 2023, Oracle and/or its affiliates. All rights reserved.
Documentation extracted from Debian's OpenJDK Development Kit package.
Licensed under the GNU General Public License, version 2, with the Classpath Exception.
Various third party code in OpenJDK is licensed under different licenses (see Debian package).
Java and OpenJDK are trademarks or registered trademarks of Oracle and/or its affiliates.
https://docs.oracle.com/en/java/javase/21/docs/api/jdk.httpserver/com/sun/net/httpserver/HttpHandlers.html