aboutsummaryrefslogtreecommitdiffstats
path: root/doc/src/manual/cowboy_loop.ezdoc
blob: 79b96f9080942009c4e9bc3e13be151ef0cf1f14 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
::: cowboy_loop

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 ^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}

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 `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.