= cowboy_loop(3) == Name cowboy_loop - loop handlers == Description The `cowboy_loop` module implements a handler interface for long running HTTP connections. It is the recommended interface for long polling and server-sent events, amongst others. This module is a sub protocol that defines three callbacks to be implemented by handlers. The `init/2` and `terminate/3` callbacks are common to all handler types and are documented in the manual for the link:cowboy_handler.asciidoc[cowboy_handler] module. The `info/3` callback is specific to loop handlers and will be called as many times as necessary until a reply is sent. It is highly recommended to return a timeout value from the `init/2` callback to ensure that the process is terminated when no data has been received during that timespan. The default timeout is `infinity`, which should only be used if you have alternate means of ending inactive connections. == Terminate reasons The following values may be received as the terminate reason in the optional `terminate/3` callback. normal:: The connection was closed normally before switching to the loop sub protocol. This typically happens if an `ok` tuple is returned from the `init/2` callback. stop:: The handler requested to close the connection by returning a `stop` tuple. timeout:: The connection has been closed due to inactivity. The timeout value can be configured from `init/2`. The response sent when this happens is a `204 No Content`. {crash, Class, Reason}:: A crash occurred in the handler. `Class` and `Reason` can be used to obtain more information about the crash. The function `erlang:get_stacktrace/0` can also be called to obtain the stacktrace of the process when the crash occurred. {error, overflow}:: The connection is being closed and the process terminated because the buffer Cowboy uses to keep data sent by the client has reached its maximum. The buffer size can be configured through the environment value `loop_max_buffer` and defaults to 5000 bytes. + If the long running request comes with a body it is recommended to process this body before switching to the loop sub protocol. {error, closed}:: The socket has been closed brutally without a close frame being received first. {error, Reason}:: A socket error ocurred. == Callbacks === info(Info, Req, State) -> {ok, Req, State} | {ok, Req, State, hibernate} | {stop, Req, State} Info = any():: Message received by the process. Req = cowboy_req:req():: The Req object. State = any():: Handler state. Handle the Erlang message received. This function will be called every time an Erlang message has been received. The message can be any Erlang term. The `stop` return value can be used to stop the receive loop, typically because a response has been sent. The `hibernate` option will hibernate the process until it receives another message.