aboutsummaryrefslogtreecommitdiffstats
path: root/doc/src/manual/cowboy_loop_handler.ezdoc
diff options
context:
space:
mode:
Diffstat (limited to 'doc/src/manual/cowboy_loop_handler.ezdoc')
-rw-r--r--doc/src/manual/cowboy_loop_handler.ezdoc91
1 files changed, 91 insertions, 0 deletions
diff --git a/doc/src/manual/cowboy_loop_handler.ezdoc b/doc/src/manual/cowboy_loop_handler.ezdoc
new file mode 100644
index 0000000..0811a9a
--- /dev/null
+++ b/doc/src/manual/cowboy_loop_handler.ezdoc
@@ -0,0 +1,91 @@
+::: cowboy_loop_handler
+
+The `cowboy_loop_handler` behaviour defines the interface used
+by HTTP handlers that do not send a response directly, instead
+requiring a receive loop to process Erlang messages.
+
+This interface is best fit for long-polling types of requests.
+
+The `init/3` callback will always be called, followed by zero
+or more calls to `info/3`. The `terminate/3` callback will
+always be called last.
+
+:: Types
+
+None.
+
+:: Callbacks
+
+: init({TransportName, ProtocolName}, Req, Opts)
+ -> {loop, Req, State}
+ | {loop, Req, State, hibernate}
+ | {loop, Req, State, Timeout}
+ | {loop, Req, State, Timeout, hibernate}
+ | {shutdown, Req, State}
+
+Types:
+
+* TransportName = tcp | ssl | atom()
+* ProtocolName = http | atom()
+* Req = cowboy_req:req()
+* Opts = any()
+* State = any()
+* Timeout = timeout()
+
+Initialize the state for this request.
+
+This callback will typically be used to register this process
+to an event manager or a message queue in order to receive
+the messages the handler wants to process.
+
+The receive loop will run for a duration of up to `Timeout`
+milliseconds after it last received data from the socket,
+at which point it will stop and send a `204 No Content` reply.
+By default this value is set to `infinity`. It is recommended
+to either set this value or ensure by any other mechanism
+that the handler will be closed after a certain period of
+inactivity.
+
+The `hibernate` option will hibernate the process until it
+starts receiving messages.
+
+The `shutdown` return value can be used to skip the receive
+loop entirely.
+
+: info(Info, Req, State) -> {ok, Req, State} | {loop, Req, State}
+ | {loop, Req, State, hibernate}
+
+Types:
+
+* Info = any()
+* Req = cowboy_req:req()
+* State = any()
+
+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 `ok` 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.
+
+: terminate(Reason, Req, State) -> ok
+
+Types:
+
+* Reason = {normal, shutdown} | {normal, timeout} | {error, closed} | {error, overflow} | {error, atom()}
+* Req = cowboy_req:req()
+* State = any()
+
+Perform any necessary cleanup of the state.
+
+This callback will typically unregister from any event manager
+or message queue it registered to in `init/3`.
+
+This callback should release any resource currently in use,
+clear any active timer and reset the process to its original
+state, as it might be reused for future requests sent on the
+same connection.