headerValue
Description
Traverses the list of request headers with the specified function and extracts the first value the function returns a non empty Optional<T>
.
The headerValue-java directive is a mixture of map
and find
on the list of request headers. The specified function is called once for each header until the function returns a non empty Optional<T>
. The value of this Optional is extracted and presented to the inner route. If the function throws an exception the request is rejected with a MalformedHeaderRejection
. If the function returns Optional.empty()
for every header the request is rejected as “NotFound”.
This directive is the basis for building other request header related directives.
See also headerValuePF for a nicer syntactic alternative.
Example
final Function<HttpHeader, Optional<Host>> extractHostPort = header -> {
if (header instanceof Host) {
return Optional.of((Host) header);
} else {
return Optional.empty();
}
};
final Route route = headerValue(extractHostPort, host ->
complete("The port was " + host.port())
);
// tests:
testRoute(route).run(HttpRequest.GET("/").addHeader(Host.create("example.com", 5043)))
.assertEntity("The port was 5043");
testRoute(route).run(HttpRequest.GET("/"))
.assertStatusCode(StatusCodes.NOT_FOUND)
.assertEntity("The requested resource could not be found.");
Get headerValue or return a default value
Using provide and composing directives one can build a pattern where a headerValue is extracted if available or a default is returned.
final Function<HttpHeader, Optional<String>> extractExampleHeader = header -> {
if (header.is("x-example-header")) {
return Optional.of(header.value());
} else {
return Optional.empty();
}
};
final Route route = anyOf(
bindParameter(this::headerValue, extractExampleHeader),
bindParameter(this::provide, "newValue"),
(String value) -> complete("header is " + value));
// tests:
final RawHeader exampleHeader = RawHeader.create("X-Example-Header", "theHeaderValue");
testRoute(route).run(HttpRequest.GET("/").addHeader(exampleHeader))
.assertEntity("header is theHeaderValue");
testRoute(route).run(HttpRequest.GET("/"))
.assertEntity("header is newValue");