= gun_event(3)
== Name
gun_event - Events
== Description
The `gun_event` module provides the callback interface
and types for implementing event handlers.
== Callbacks
Event handlers implement the following interface.
Because types are tied to specific events, they
are documented alongside them. All event types
are exported and can be referred to as `gun_event:Type()`.
The events are ordered by the order they are likely
to be triggered, with the most frequent events listed
first.
=== init
[source,erlang]
----
init_event() :: #{
owner := pid(),
transport := tcp | tls,
origin_scheme := binary(),
origin_host := inet:hostname() | inet:ip_address(),
origin_port := inet:port_number(),
opts := gun:opts()
}
init(init_event(), State) -> State
----
Gun is initializing.
=== domain_lookup_start
[source,erlang]
----
domain_lookup_event() :: #{
host := inet:hostname() | inet:ip_address(),
port := inet:port_number(),
tcp_opts := [gen_tcp:connect_option()],
timeout := timeout(),
lookup_info => gun_tcp:lookup_info(),
error => any()
}
domain_lookup_start(domain_lookup_event(), State) -> State
----
Gun is starting to resolve the host address.
The `lookup_info` and `error` keys are never set
for this event.
=== domain_lookup_end
[source,erlang]
----
domain_lookup_end(domain_lookup_event(), State) -> State
----
Gun has finished resolving the host address.
The `lookup_info` key is only set when the lookup is
successful. The `error` key is set otherwise.
=== connect_start
[source,erlang]
----
connect_event() :: #{
lookup_info := gun_tcp:lookup_info(),
timeout := timeout(),
socket => inet:socket(),
protocol => http | http2 | socks | raw,
error => any()
}
connect_start(connect_event(), State) -> State
----
Gun is starting to connect to the host address and port.
The `socket`, `protocol` and `error` keys are never set
for this event.
=== connect_end
[source,erlang]
----
connect_end(connect_event(), State) -> State
----
Gun has finished connecting to the host address and port.
The `socket` key is set on connect success. The `error`
key is set otherwise.
The `protocol` key is only set when the transport is
`tcp` and the connection is successful. The protocol
is only known in the `tls_handshake_end` event otherwise.
=== tls_handshake_start
[source,erlang]
----
tls_handshake_event() :: #{
stream_ref => gun:stream_ref(),
reply_to => pid(),
socket := inet:socket() | ssl:sslsocket() | pid(), %% The socket before/after will be different.
tls_opts := [ssl:tls_client_option()],
timeout := timeout(),
protocol => http | http2 | socks | raw,
error => any()
}
tls_handshake_start(tls_handshake_event(), State) -> State
----
Gun has started a TLS handshake.
This and the `tls_handshake_end` event only occur when
connecting to a TLS server or when upgrading the connection
or a stream to use TLS, for example when using CONNECT or
when connecting to a secure SOCKS server.
The `stream_ref` and `reply_to` keys are only set when the
TLS handshake occurs as a result of a CONNECT request or
inside an existing CONNECT tunnel.
The `protocol` and `error` keys are never set for this event.
=== tls_handshake_end
[source,erlang]
----
tls_handshake_end(tls_handshake_event(), State) -> State
----
Gun has finished a TLS handshake.
The `protocol` key is set on TLS handshake success. The
`error` key is set otherwise.
=== request_start
[source,erlang]
----
request_start_event() :: #{
stream_ref := gun:stream_ref(),
reply_to := pid(),
function := headers | request | ws_upgrade | connect,
method := iodata(),
scheme => binary(),
authority := iodata(),
path => iodata(),
headers := [{binary(), iodata()}]
}
request_start(request_start_event(), State) -> State
----
Gun is starting to send a request.
The `scheme` and `path` keys are never set when the `function`
is set to `connect`.
=== request_headers
[source,erlang]
----
request_headers(request_start_event(), State) -> State
----
Gun has finished sending the request headers.
=== request_end
[source,erlang]
----
request_end_event() :: #{
stream_ref := gun:stream_ref(),
reply_to := pid()
}
request_end(request_end_event(), State) -> State
----
Gun has finished sending the request.
=== push_promise_start
[source,erlang]
----
push_promise_start_event() :: #{
stream_ref := gun:stream_ref(),
reply_to := pid()
}
push_promise_start(push_promise_start_event(), State) -> State
----
Gun has begun receiving a promised request (server push).
=== push_promise_end
[source,erlang]
----
push_promise_end_event() :: #{
stream_ref := gun:stream_ref(),
reply_to := pid(),
promised_stream_ref => gun:stream_ref(),
method := binary(),
uri := binary(),
headers := [{binary(), iodata()}]
}
push_promise_end(push_promise_end_event(), State) -> State
----
Gun has finished receiving a promised request (server push).
Promised requests never include a body.
Promised requests received during the graceful shutdown of the
connection get canceled immediately.
// @todo The cancel event should probably trigger as well.
=== response_start
[source,erlang]
----
response_start_event() :: #{
stream_ref := gun:stream_ref(),
reply_to := pid()
}
response_start(response_start_event(), State) -> State
----
Gun has begun receiving a response.
=== response_inform
[source,erlang]
----
response_headers_event() :: #{
stream_ref := gun:stream_ref(),
reply_to := pid(),
status := non_neg_integer(),
headers := [{binary(), binary()}]
}
response_inform(response_headers_event(), State) -> State
----
Gun has received an informational response (1xx status code).
A `status` with value 101 indicates that the response has
concluded as the stream will be upgraded to a new protocol.
=== response_headers
[source,erlang]
----
response_headers(response_headers_event(), State) -> State
----
Gun has finished receiving response headers.
=== response_trailers
[source,erlang]
----
response_trailers_event() :: #{
stream_ref := gun:stream_ref(),
reply_to := pid(),
headers := [{binary(), binary()}]
}
response_trailers(response_trailers_event(), State) -> State
----
Gun has received response trailers.
=== response_end
[source,erlang]
----
response_end_event() :: #{
stream_ref := gun:stream_ref(),
reply_to := pid()
}
response_end(response_end_event(), State) -> State
----
Gun has finished receiving a response.
=== ws_upgrade
[source,erlang]
----
ws_upgrade_event() :: #{
stream_ref := gun:stream_ref(),
reply_to := pid(),
opts := gun:ws_opts()
}
ws_upgrade(ws_upgrade_event(), State) -> State
----
A Websocket upgrade was requested.
Success is indicated by a response (101 informational
if HTTP/1.1, 2xx if HTTP/2) followed by a `protocol_changed`
event.
=== ws_recv_frame_start
[source,erlang]
----
ws_recv_frame_start_event() :: #{
stream_ref := gun:stream_ref(),
reply_to := pid(),
frag_state := cow_ws:frag_state(),
extensions := cow_ws:extensions()
}
ws_recv_frame_start(ws_recv_frame_start_event(), State) -> State
----
Gun has begun receiving a Websocket frame.
=== ws_recv_frame_header
[source,erlang]
----
ws_recv_frame_header_event() :: #{
stream_ref := gun:stream_ref(),
reply_to := pid(),
frag_state := cow_ws:frag_state(),
extensions := cow_ws:extensions(),
type := cow_ws:frame_type(),
rsv := cow_ws:rsv(),
len := non_neg_integer(),
mask_key := cow_ws:mask_key()
}
ws_recv_frame_header(ws_recv_frame_header_event(), State) -> State
----
Gun has received the header part of a Websocket frame.
It will be immediately be followed by the frame's payload.
=== ws_recv_frame_end
[source,erlang]
----
ws_recv_frame_end_event() :: #{
stream_ref := gun:stream_ref(),
reply_to := pid(),
extensions := cow_ws:extensions(),
close_code := undefined | cow_ws:close_code(),
payload := binary()
}
ws_recv_frame_end(ws_recv_frame_end_event(), State) -> State
----
Gun has finished receiving a Websocket frame.
=== ws_send_frame_start
[source,erlang]
----
ws_send_frame_event() :: #{
stream_ref := gun:stream_ref(),
reply_to := pid(),
extensions := cow_ws:extensions(),
frame := gun:ws_frame()
}
ws_send_frame_start(ws_send_frame_event(), State) -> State
----
Gun has started sending a Websocket frame.
=== ws_send_frame_end
[source,erlang]
----
ws_send_frame_end(ws_send_frame_event(), State) -> State
----
Gun has finished sending a Websocket frame.
=== protocol_changed
[source,erlang]
----
protocol_changed_event() :: #{
stream_ref := gun:stream_ref(),
protocol := http | http2 | socks | raw | ws
}
protocol_changed(protocol_changed_event(), State) -> State
----
The protocol has changed for either the entire Gun connection
or for a specific stream.
The `stream_ref` key is only set when the protocol has
changed for a specific stream or inside a CONNECT tunnel.
This event occurs during successful Websocket upgrades,
as a result of successful CONNECT requests or after a
SOCKS tunnel was successfully established.
=== origin_changed
[source,erlang]
----
origin_changed_event() :: #{
stream_ref => gun:stream_ref(),
type := connect | socks5,
origin_scheme := binary(),
origin_host := inet:hostname() | inet:ip_address(),
origin_port := inet:port_number()
}
origin_changed(origin_changed_event(), State) -> State
----
The origin server has changed for either the Gun connection
or for a specific stream.
The `stream_ref` key is only set when the origin has
changed for a specific stream or inside a CONNECT tunnel.
=== cancel
[source,erlang]
----
cancel_event() :: #{
stream_ref := gun:stream_ref(),
reply_to := pid(),
endpoint := local | remote,
reason := atom()
}
cancel(cancel_event(), State) -> State
----
A stream has been canceled.
HTTP/1.1 streams can't be canceled at the protocol level. In
this case Gun will silence the stream for the user but events
may still occur.
HTTP/2 streams can be canceled both by the client and the
server. Events may still occur for a short time after the
stream has been canceled.
=== disconnect
[source,erlang]
----
disconnect_event() :: #{
reason := normal | closed | {error, any()}
}
disconnect(disconnect_event(), State) -> State
----
Gun has been disconnected from the server.
=== terminate
[source,erlang]
----
terminate_event() :: #{
state := not_connected
| domain_lookup | connecting | initial_tls_handshake | tls_handshake
| connected | connected_data_only | connected_ws_only,
reason := normal | shutdown | {shutdown, any()} | any()
}
terminate(terminate_event(), State) -> State
----
Gun is terminating.
== Changelog
* *2.0*: Module introduced.
== See also
link:man:gun(7)[gun(7)],
link:man:gun(3)[gun(3)]