headerValue
Description
Traverses the list of request headers with the specified function and extracts the first value the function returns as Some(value)
.
The headerValue 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 Some(value)
. This value 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 None
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
- Scala
-
def extractHostPort: HttpHeader => Option[Int] = { case h: `Host` => Some(h.port) case x => None } val route = headerValue(extractHostPort) { port => complete(s"The port was $port") } // tests: Get("/") ~> Host("example.com", 5043) ~> route ~> check { responseAs[String] shouldEqual "The port was 5043" } Get("/") ~> Route.seal(route) ~> check { status shouldEqual NotFound responseAs[String] shouldEqual "The requested resource could not be found." }
- Java
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.
- Scala
-
val exampleHeaderValue = "exampleHeaderValue".toLowerCase def extractExampleHeader: HttpHeader => Option[String] = { case HttpHeader(`exampleHeaderValue`, value) => Some(value) case _ => None } val route = (headerValue(extractExampleHeader) | provide("newValue")) { value => complete(s"headerValue $value") } // tests: Get("/") ~> RawHeader("exampleHeaderValue", "theHeaderValue") ~> route ~> check { responseAs[String] shouldEqual "headerValue theHeaderValue" } Get("/") ~> route ~> check { responseAs[String] shouldEqual "headerValue newValue" }
- Java