recoverRejections
§Signature
§Description
Low level directive – unless you're sure you need to be working on this low-level you might instead want to try the handleRejections directive which provides a nicer DSL for building rejection handlers.
Transforms rejections from the inner route with an immutable.Seq[Rejection] ⇒ RouteResult
function.
A RouteResult
is either a Complete(HttpResponse(...))
or rejections Rejected(rejections)
.
注釈
To learn more about how and why rejections work read the Rejections section of the documentation.
§Example
- val authRejectionsToNothingToSeeHere = recoverRejections { rejections =>
- if (rejections.exists(_.isInstanceOf[AuthenticationFailedRejection]))
- Complete(HttpResponse(entity = "Nothing to see here, move along."))
- else if (rejections == Nil) // see "Empty Rejections" for more details
- Complete(HttpResponse(StatusCodes.NotFound, entity = "Literally nothing to see here."))
- else
- Rejected(rejections)
- }
- val neverAuth: Authenticator[String] = creds => None
- val alwaysAuth: Authenticator[String] = creds => Some("id")
-
- val route =
- authRejectionsToNothingToSeeHere {
- pathPrefix("auth") {
- path("never") {
- authenticateBasic("my-realm", neverAuth) { user =>
- complete("Welcome to the bat-cave!")
- }
- } ~
- path("always") {
- authenticateBasic("my-realm", alwaysAuth) { user =>
- complete("Welcome to the secret place!")
- }
- }
- }
- }
-
- // tests:
- Get("/auth/never") ~> route ~> check {
- status shouldEqual StatusCodes.OK
- responseAs[String] shouldEqual "Nothing to see here, move along."
- }
- Get("/auth/always") ~> route ~> check {
- status shouldEqual StatusCodes.OK
- responseAs[String] shouldEqual "Welcome to the secret place!"
- }
- Get("/auth/does_not_exist") ~> route ~> check {
- status shouldEqual StatusCodes.NotFound
- responseAs[String] shouldEqual "Literally nothing to see here."
- }
- val authRejectionsToNothingToSeeHere = recoverRejectionsWith { rejections =>
- Future {
- // imagine checking rejections takes a longer time:
- if (rejections.exists(_.isInstanceOf[AuthenticationFailedRejection]))
- Complete(HttpResponse(entity = "Nothing to see here, move along."))
- else
- Rejected(rejections)
- }
- }
- val neverAuth: Authenticator[String] = creds => None
-
- val route =
- authRejectionsToNothingToSeeHere {
- pathPrefix("auth") {
- path("never") {
- authenticateBasic("my-realm", neverAuth) { user =>
- complete("Welcome to the bat-cave!")
- }
- }
- }
- }
-
- // tests:
- Get("/auth/never") ~> route ~> check {
- status shouldEqual StatusCodes.OK
- responseAs[String] shouldEqual "Nothing to see here, move along."
- }
Contents