0
Fork 0
mirror of https://github.com/ninenines/cowboy.git synced 2025-07-15 04:30:25 +00:00

Update cowboy_websocket_manual

This commit is contained in:
Loïc Hoguin 2016-12-22 18:13:25 +01:00
parent e584412de7
commit cbc7056395
No known key found for this signature in database
GPG key ID: 71366FF21851DF03
3 changed files with 136 additions and 120 deletions

View file

@ -9,9 +9,7 @@ cowboy_http - HTTP/1.1
The module `cowboy_http` implements HTTP/1.1 and HTTP/1.0 The module `cowboy_http` implements HTTP/1.1 and HTTP/1.0
as a Ranch protocol. as a Ranch protocol.
== Types == Options
=== opts()
[source,erlang] [source,erlang]
---- ----
@ -40,9 +38,7 @@ It can be updated without restarting listeners using the
Ranch functions `ranch:get_protocol_options/1` and Ranch functions `ranch:get_protocol_options/1` and
`ranch:set_protocol_options/2`. `ranch:set_protocol_options/2`.
=== Option descriptions The default value is given next to the option name:
The default value is given next to the option name.
env (#{}):: env (#{})::
Middleware environment. Middleware environment.

View file

@ -9,9 +9,7 @@ cowboy_http2 - HTTP/2
The module `cowboy_http2` implements HTTP/2 The module `cowboy_http2` implements HTTP/2
as a Ranch protocol. as a Ranch protocol.
== Types == Options
=== opts()
[source,erlang] [source,erlang]
---- ----
@ -31,9 +29,7 @@ It can be updated without restarting listeners using the
Ranch functions `ranch:get_protocol_options/1` and Ranch functions `ranch:get_protocol_options/1` and
`ranch:set_protocol_options/2`. `ranch:set_protocol_options/2`.
=== Option descriptions The default value is given next to the option name:
The default value is given next to the option name.
env (#{}):: env (#{})::
Middleware environment. Middleware environment.

View file

@ -2,44 +2,114 @@
== Name == Name
cowboy_websocket - Websocket protocol cowboy_websocket - Websocket
== Description == Description
The `cowboy_websocket` module implements the Websocket protocol. The module `cowboy_websocket` implements Websocket
as a Ranch protocol. It also defines a callback interface
for handling Websocket connections.
This module is a sub protocol that defines four callbacks to == Options
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 `websocket_handle/2` and `websocket_info/2` callbacks are [source,erlang]
specific to Websocket handlers and will be called as many times ----
as necessary until the Websocket connection is closed. opts() :: #{
websocket_compress := boolean()
}
----
The `init/2` callback can be used to negotiate Websocket protocol Configuration for the Websocket protocol.
extensions with the client. It is highly recommended to return a
timeout value from this callback to ensure that the process is This configuration is passed to Cowboy when starting listeners
terminated when no data has been received during that timespan. using `cowboy:start_clear/4` or `cowboy:start_tls/4` functions.
The default timeout is `infinity`, which should only be used if
you have alternate means of ending inactive connections. It can be updated without restarting listeners using the
Ranch functions `ranch:get_protocol_options/1` and
`ranch:set_protocol_options/2`.
The default value is given next to the option name:
websocket_compress (false)::
Whether to enable the Websocket frame compression
extension. Frames will only be compressed for the
clients that support this extension.
== Callbacks
Websocket handlers must implement the following callback
interface:
[source,erlang]
----
init(Req, State)
-> {cowboy_websocket, Req, State}
| {cowboy_websocket, Req, State, hibernate}
| {cowboy_websocket, Req, State, timeout()}
| {cowboy_websocket, Req, State, timeout(), hibernate}
websocket_init(State) -> CallResult %% optional
websocket_handle(InFrame, State) -> CallResult
websocket_info(Info, State) -> CallResult
terminate(Reason, undefined, State) -> any() %% optional
Req :: cowboy_req:req()
State :: any()
InFrame :: {text | binary | ping | pong, binary()}
OutFrame :: cow_ws:frame()
Info :: any()
CallResult :: {ok, State}
| {ok, State, hibernate}
| {reply, OutFrame | [OutFrame], State}
| {reply, OutFrame | [OutFrame], State, hibernate}
| {stop, State}
Reason :: normal | stop | timeout
| remote | {remote, cow_ws:close_code(), binary()}
| {error, badencoding | badframe | closed | atom()}
| {crash, error | exit | throw, any()}
----
The `init/2` callback is common to all handlers. To upgrade
the connection to Websocket, it must return `cowboy_websocket`
as the first element of the tuple.
Any operation requiring the HTTP request must be done in the
`init/2` function, as the Req object will not be available
after it returns. Websocket sub-protocol selection should
therefore be done in this function.
The optional `websocket_init/1` callback will be called once
the connection has been upgraded to Websocket. It can be used
to perform any required initialization of the handler.
Note that the `init/2` function does not run in the same
process as the Websocket callbacks. Any Websocket-specific
initialization must be done in `websocket_init/1`.
The `websocket_handle/2` callback will be called for every
frame received. The `websocket_info/2` callback will be
called for every Erlang message received.
All three Websocket callbacks may send one or more frames
back to the client (by returning a `reply` tuple) or terminate
the connection (by sending a `close` frame or returning a `stop`
tuple).
The optional `terminate/3` callback will ultimately be called
with the reason for the termination of the connection. This
callback is common to all handlers. Note that Websocket has
no concept of requests so it sets the second argument to
undefined.
Cowboy will terminate the process right after closing the Cowboy will terminate the process right after closing the
Websocket connection. This means that there is no real need to Websocket connection. This means that there is no need to
perform any cleanup in the optional `terminate/3` callback. perform any cleanup in the `terminate/3` callback.
== Meta values The following terminate reasons are defined for Websocket
connections:
websocket_compress = boolean()::
Whether a websocket compression extension in in use.
websocket_version = 7 | 8 | 13::
The version of the Websocket protocol being used.
== Terminate reasons
The following values may be received as the terminate reason
in the optional `terminate/3` callback.
normal:: normal::
The connection was closed normally before establishing a Websocket The connection was closed normally before establishing a Websocket
@ -82,60 +152,14 @@ timeout::
{error, Reason}:: {error, Reason}::
A socket error ocurred. A socket error ocurred.
== Callbacks == Changelog
=== websocket_handle(InFrame, State) -> Ret * *2.0*: The Req object is no longer passed to Websocket callbacks.
* *2.0*: The callback `websocket_terminate/3` was removed in favor of `terminate/3`.
* *1.0*: Protocol introduced.
[source,erlang] == See also
----
Ret = {ok, State}
| {ok, State, hibernate}
| {reply, OutFrame | [OutFrame], State}
| {reply, OutFrame | [OutFrame], State, hibernate}
| {stop, State}
InFrame = {text | binary | ping | pong, binary()} link:man:cowboy(7)[cowboy(7)],
State = any() link:man:cowboy_http(3)[cowboy_http(3)],
OutFrame = cow_ws:frame() link:man:cowboy_http2(3)[cowboy_http2(3)]
----
Handle the data received from the Websocket connection.
This function will be called every time data is received
from the Websocket connection.
The `stop` return value can be used to close the
connection. A close reply will also result in the connection
being closed.
The `hibernate` option will hibernate the process until
it receives new data from the Websocket connection or an
Erlang message.
=== websocket_info(Info, State) -> Ret
[source,erlang]
----
Ret = {ok, State}
| {ok, State, hibernate}
| {reply, OutFrame | [OutFrame], State}
| {reply, OutFrame | [OutFrame], State, hibernate}
| {stop, State}
Info = any()
State = any()
OutFrame = cow_ws:frame()
----
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 close the
connection. A close reply will also result in the connection
being closed.
The `hibernate` option will hibernate the process until
it receives another message or new data from the Websocket
connection.