inca/circumflex

Trailing slash in nested routes is handled incorrectly

Closed this issue · 2 comments

Nested REST-style router does not handle urls without slash:

class Main extends RequestRouter {
  any("/page/*") = new PageRouter
  get("/page") = "in main"
}

class PageRouter extends RequestRouter("/page") {
  get("/") = "in page"
}

Result of /page request is "in main", not "in page", while /page/ returns "in page" as it should. Url without trailing slash should be handled by nested router, shouldn't it?

inca commented

The best option is to forward requests to force trailing slashes:

class Main extends RequestRouter {
  any("/page") = forward("/page/")
  any("/page/*") = new PageRouter
}

class PageRouter extends RequestRouter("/page") {
  get("/") = "in page"
}

But you might as well find this useful too:

class Main extends RequestRouter {
  any("/page*") = new PageRouter
  get("/page") = "in main"  // won't match
}

class PageRouter extends RequestRouter("/page") {
  get("/?") = "in page"
}

We do not provide special treatment to slashes inside prefix, and we do it on purpose. This way you always get the full pattern for each of your route by simply appending it to router's prefix. This is way easier to understand when debugging complex routes, I think.

Thank you for clarifications!