mapUnmatchedPath

Signature

def mapUnmatchedPath(f: Uri.Path 

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 org.apache.pekko.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");