mapUnmatchedPath

Signature

def mapUnmatchedPath(f: Uri.Path => Uri.Path): Directive0

Description

Transforms the unmatchedPath field of the request context for inner routes.

The mapUnmatchedPath directive is used as a building block for writing Custom Directives. You can use it for implementing custom path matching directives.

Use extractUnmatchedPath for extracting the current value of the unmatched path.

Example

Scala
sourcedef ignore456(path: Uri.Path) = path match {
  case s @ Uri.Path.Segment(head, tail) if head.startsWith("456") =>
    val newHead = head.drop(3)
    if (newHead.isEmpty) tail
    else s.copy(head = head.drop(3))
  case _ => path
}
val ignoring456 = mapUnmatchedPath(ignore456)

val route =
  pathPrefix("123") {
    ignoring456 {
      path("abc") {
        complete("Content")
      }
    }
  }

// tests:
Get("/123/abc") ~> route ~> check {
  responseAs[String] shouldEqual "Content"
}
Get("/123456/abc") ~> route ~> check {
  responseAs[String] shouldEqual "Content"
}
Java
sourceimport static akka.http.javadsl.server.Directives.mapUnmatchedPath;

final Function<String, String> ignore456 = path -> {
  int slashPos = path.indexOf("/");
  if (slashPos != -1) {
    String head = path.substring(0, slashPos);
    String tail = path.substring(slashPos);
    if (head.length() <= 3) {
      return tail;
    } else {
      return path.substring(3);
    }
  } else {
    return path;
  }
};

final Route route = pathPrefix("123", () ->
  mapUnmatchedPath(ignore456, () ->
    path("abc", () ->
      complete("Content")
    )
  )
);

// tests:
testRoute(route).run(HttpRequest.GET("/123/abc"))
  .assertEntity("Content");
testRoute(route).run(HttpRequest.GET("/123456/abc"))
  .assertEntity("Content");
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.