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
def 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
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");
The source code for this page can be found here.