mapRouteResultFuture • Akka HTTP (original) (raw)

Signature

def mapRouteResultFuture(f: Future[RouteResult] => Future[RouteResult]): Directive0

Description

Asynchronous version of mapRouteResult.

It’s similar to mapRouteResultWith, however it’s Future[RouteResult] => Future[RouteResult] Function<CompletionStage<RouteResult>, CompletionStage<RouteResult>> instead of RouteResult => Future[RouteResult] Function<RouteResult, CompletionStage<RouteResult>> which may be useful when combining multiple transformations and / or wanting to recover from a failed route result.

See Result Transformation Directives for similar directives.

Example

Scala

source`val tryRecoverAddServer = mapRouteResultFuture { fr => fr recover { case ex: IllegalArgumentException => Complete(HttpResponse(StatusCodes.InternalServerError)) } map { case Complete(res) => Complete(res.addHeader(Server("MyServer 1.0"))) case rest => rest } }

val route = tryRecoverAddServer { complete("Hello world!") }

// tests: Get("/") ~> route ~> check { status shouldEqual StatusCodes.OK header[Server] shouldEqual Some(Server("MyServer 1.0")) }`

Java

source`import static akka.http.javadsl.server.Directives.mapRouteResultFuture;

final Route route = mapRouteResultFuture(cr -> cr.exceptionally(t -> { if (t instanceof IllegalArgumentException) { return RouteResults.complete( HttpResponse.create().withStatus(StatusCodes.INTERNAL_SERVER_ERROR)); } else { return null; } }).thenApply(rr -> { if (rr instanceof Complete) { final HttpResponse res = ((Complete) rr).getResponse(); return RouteResults.complete( res.addHeader(Server.create(ProductVersion.create("MyServer", "1.0")))); } else { return rr; } }), () -> complete("Hello world!"));

// tests: testRoute(route).run(HttpRequest.GET("/")) .assertStatusCode(StatusCodes.OK) .assertHeaderExists(Server.create(ProductVersion.create("MyServer", "1.0")));`

Found an error in this documentation? The source code for this page can be found here. Please feel free to edit and contribute a pull request.