= cowboy_router(3)

== Name

cowboy_router - Router middleware

== Description

The `cowboy_router` middleware maps the requested host and
path to the handler to be used for processing the request.

The router takes the `dispatch` rules as input from the
middleware environment. Dispatch rules are generated by
calling the
link:man:cowboy_router:compile(3)[cowboy_router:compile(3)]
function. The environment can contain the rules directly
or a tuple `{persistent_term, Key}`, in which case Cowboy
will call `persistent_term:get(Key)` to retrieve the
dispatch rules.

When a route matches, the router sets the `handler` and
`handler_opts` middleware environment values containing
the handler module and initial state, respectively.

The router will stop execution when no route matches.
It will send a 400 response if no host was found, and
a 404 response otherwise.

== Exports

* link:man:cowboy_router:compile(3)[cowboy_router:compile(3)] - Compile routes to the resources

== Types

=== bindings()

[source,erlang]
----
bindings() :: #{atom() => any()}
----

Bindings found during routing.

=== dispatch_rules()

Opaque type containing the compiled routes.

=== routes()

[source,erlang]
----
routes() = [
    {Host, PathList} |
    {Host, Fields, PathList}
]

PathList :: [
    {Path, Handler, InitialState} |
    {Path, Fields, Handler, InitialState}
]

Host         :: '_' | iodata()
Path         :: '_' | iodata()
Fields       :: cowboy:fields()
Handler      :: module()
InitialState :: any()
----

Human readable list of routes to handlers.

Cowboy uses this list to map hosts and paths, optionally
augmented with constraints applied to the bindings, to
handler modules.

The syntax for routes is currently defined in the user guide.

// @todo The syntax should probably be in this module,
// and the user guide show more practical examples.

=== tokens()

[source,erlang]
----
tokens() :: [binary()]
----

List of `host_info` and `path_info` tokens that were found
using the `...` syntax.

== See also

link:man:cowboy(7)[cowboy(7)],
link:man:cowboy_req:binding(3)[cowboy_req:binding(3)],
link:man:cowboy_req:bindings(3)[cowboy_req:bindings(3)],
link:man:cowboy_req:host_info(3)[cowboy_req:host_info(3)],
link:man:cowboy_req:path_info(3)[cowboy_req:path_info(3)]
