Name
cowboy_loop - Loop handlers
Description
The module cowboy_loop
defines a callback interface for long running HTTP connections.
You should switch to this behavior for long polling, server-sent events and similar long-running requests.
There are generally two usage patterns:
- Loop until receiving a specific message, then send a response and stop execution (for example long polling);
- Or initiate a response in
init/2
and stream the body in info/3
as necessary (for example server-sent events).
Callbacks
Loop handlers implement the following interface:
init(Req, State)
-> {cowboy_loop, Req, State}
| {cowboy_loop, Req, State, hibernate | timeout()}
info(Info, Req, State)
-> {ok, Req, State}
| {ok, Req, State, hibernate | timeout()}
| {stop, Req, State}
terminate(Reason, Req, State) -> ok %% optional
Req :: cowboy_req:req()
State :: any()
Info :: any()
Reason :: stop
| {crash, error | exit | throw, any()}
The init/2
callback is common to all handlers. To switch to the loop behavior, it must return cowboy_loop
as the first element of the tuple.
The info/3
callback will be called for every Erlang message received. It may choose to continue the receive loop or stop it.
The optional terminate/3
callback will ultimately be called with the reason for the termination of the handler. Cowboy will terminate the process right after this. There is no need to perform any cleanup in this callback.
The following terminate reasons are defined for loop handlers:
- stop
The handler requested to close the connection by returning a stop
tuple.
- {crash, Class, Reason}
A crash occurred in the handler. Class
and Reason
can be used to obtain more information about the crash.
Changelog
- 2.11: A timeout may be returned instead of
hibernate
. It functions the same way as the gen_server
timeout.
- 2.0: Loop handlers no longer need to handle socket events.
- 1.0: Behavior introduced.
See also
cowboy(7), cowboy_handler(3)