[erlang-questions] Cowboy routes with Method as a condition

Loïc Hoguin <>
Wed Feb 13 12:02:05 CET 2013

The HTTP RFC says this on page 6:

    It builds on the discipline of reference
    provided by the Uniform Resource Identifier (URI) [3], as a location
    (URL) [4] or name (URN) [20], for indicating the resource to which a
    method is to be applied.

It then defines resources as follow on page 9:

       A network data object or service that can be identified by a URI,
       as defined in section 3.2. Resources may be available in multiple
       representations (e.g. multiple languages, data formats, size, and
       resolutions) or vary in other ways.

It then describes how to locate resources in many of the following 
sections, starting with section 3.2 page 18.

Cowboy implements this. It maps URIs to resources. It makes absolutely 
no assumptions as to how your resources operate. Anything that is part 
of the URI can and will be used to locate resources. But if it's not 
part of the URI, then it's not something used to find resources as 
defined by the HTTP standard, which makes it out of the scope of the 

It still provides you with many ways to plug yourself into Cowboy to 
achieve what you want, which include:

  *  Middleware
  *  Protocol upgrade (what REST handlers are doing)
  *  init/3 based method dispatching
  *  handle/2 based method dispatching

And I'm sure there's more.

On 02/13/2013 11:42 AM, Max Lapshin wrote:
> Loic, my idea about routing is that router is a piece of software that
> translates input http request into presentation, convenient for handler
> and selects proper handler for this with proper arguments.
> I don't understand your logic: you allow to run regexp to validate if
> constraint is a digit:   "/users/:user_id", [{user_id,fun() -> .. end}],
> but you are strongly against validating method in constraints.
> You tell me to spread logic between your router and my router. You tell
> me that I need to use two routers that will somehow interfere with each
> other. What is the idea? I really don't understand.
> On Wed, Feb 13, 2013 at 2:39 PM, Loïc Hoguin <
> <mailto:>> wrote:
>     On 02/13/2013 11:34 AM, Max Lapshin wrote:
>         handle(Req, State) ->
>               handle_method(cowboy_req:get(__method, Req), Req, State).
>           will require
>         handle_method(<<"GET">>, Req, State)
>         handle_method(<<"DELETE">>, Req, State)
>         handle_method(Other, Req, State)
>             here we copy from module to module default reply on "method not
>         supported" or 404, whatever we choose.
>         with method constraints code can look so:
>         init(_, Req, [Action]) ->
>            {ok, Req, Action}.
>         handle(Req, show) ->
>             ..
>         handle(Req, destroy) ->
>             ..
>         handle(Req, list) ->
>             ..
>             .
>         And no "default handler" because it is not required. Only good
>         requests
>         can pass to this handler.
>     Then in your init function do something like
>     your_lib:route_method(Req) which returns {ok, Req, Action} if it's
>     good or {shutdown, ...} if not? It'll do exactly what you just said.
>     --
>     Loïc Hoguin
>     Erlang Cowboy
>     Nine Nines
>     http://ninenines.eu

Loïc Hoguin
Erlang Cowboy
Nine Nines

More information about the erlang-questions mailing list