From f0cae8dbcf8d07035be069860fc4b22f7577d154 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Hoguin?= Date: Wed, 14 Nov 2018 16:42:46 +0100 Subject: Document some undefined behavior in cowboy_router --- doc/src/guide/routing.asciidoc | 8 ++++++++ src/cowboy_router.erl | 2 ++ 2 files changed, 10 insertions(+) diff --git a/doc/src/guide/routing.asciidoc b/doc/src/guide/routing.asciidoc index 47ef3c5..e5f8c33 100644 --- a/doc/src/guide/routing.asciidoc +++ b/doc/src/guide/routing.asciidoc @@ -124,6 +124,14 @@ You can also have imbricated optional segments. [source,erlang] PathMatch = "/hats/[page/[:number]]". +While Cowboy does not reject multiple brackets in a route, +the behavior may be undefined if the route is under-specified. +For example, this route requires constraints to determine what +is a chapter and what is a page, since they are both optional: + +[source,erlang] +PathMatch = "/book/[:chapter]/[:page]". + You can retrieve the rest of the host or path using `[...]`. In the case of hosts it will match anything before, in the case of paths anything after the previously matched segments. It is diff --git a/src/cowboy_router.erl b/src/cowboy_router.erl index 754e3e7..44a7e18 100644 --- a/src/cowboy_router.erl +++ b/src/cowboy_router.erl @@ -428,6 +428,8 @@ compile_test_() -> {[<<"horses">>], [], h, o}, {[<<"hats">>], [], h, o}, {[<<"hats">>, <<"page">>, number], [], h, o}]}]}, + {[{'_', [{"/hats/:page/:number", h, o}]}], [{'_', [], [ + {[<<"hats">>, page, number], [], h, o}]}]}, {[{'_', [{"/hats/[page/[:number]]", h, o}]}], [{'_', [], [ {[<<"hats">>], [], h, o}, {[<<"hats">>, <<"page">>], [], h, o}, -- cgit v1.2.3