Current section
Files
Jump to
Current section
Files
src/nhttp_protocol.erl
-module(nhttp_protocol).
-moduledoc """
Behaviour for nhttp's proc_lib protocol loop modules.
A protocol module owns one phase of a connection process's lifetime:
`nhttp_conn` (pre-classification socket wait), `nhttp_conn_h1`,
`nhttp_conn_h2`, `nhttp_conn_h3`, and `nhttp_conn_ws_h1` (post-upgrade
WebSocket session). The connection process never changes pid across
phases; control is handed from one module's loop to the next by a tail
call into `loop/3`.
`loop/3` is the (re-)entry point of the module's receive loop:
`nhttp_conn` tail-calls it after protocol classification, and
`proc_lib:hibernate/3` wake-ups re-enter through it or a module wake
function that converges on it. The state term is owned by the module
that is currently looping; callers treat it as opaque.
The three `system_*` callbacks are the `sys` contract for a special
process (see `sys:handle_system_msg/6`, called with the looping module
as the callback module): `system_continue/3` must re-enter `loop/3`,
`system_terminate/4` must run the connection's termination path and
exit, and `system_code_change/4` returns the (unchanged) state via the
`?NHTTP_SYSTEM_CODE_CHANGE_NOOP` macro from `nhttp_proc_lib.hrl`.
""".
-callback loop(Parent :: pid(), Debug :: [sys:debug_option()], State :: term()) ->
no_return().
-callback system_continue(Parent :: pid(), Debug :: [sys:debug_option()], State :: term()) ->
no_return().
-callback system_terminate(
Reason :: term(), Parent :: pid(), Debug :: [sys:debug_option()], State :: term()
) -> no_return().
-callback system_code_change(
State :: term(), Module :: module(), OldVsn :: term(), Extra :: term()
) -> {ok, NewState :: term()}.