diff options
author | Loïc Hoguin <[email protected]> | 2019-05-13 14:04:34 +0200 |
---|---|---|
committer | Loïc Hoguin <[email protected]> | 2019-05-13 14:04:34 +0200 |
commit | a309f196d15d3045d2e70b2d7e23858f47adb7df (patch) | |
tree | 6af8caa19dbccd790b4eefed298a924f682e4322 | |
parent | 3aa7168404e62f9ea9e290380b93569eff4372a8 (diff) | |
download | gun-a309f196d15d3045d2e70b2d7e23858f47adb7df.tar.gz gun-a309f196d15d3045d2e70b2d7e23858f47adb7df.tar.bz2 gun-a309f196d15d3045d2e70b2d7e23858f47adb7df.zip |
Add the terminate event
-rw-r--r-- | src/gun.erl | 9 | ||||
-rw-r--r-- | src/gun_default_event_h.erl | 4 | ||||
-rw-r--r-- | src/gun_event.erl | 10 | ||||
-rw-r--r-- | test/event_SUITE.erl | 19 |
4 files changed, 41 insertions, 1 deletions
diff --git a/src/gun.erl b/src/gun.erl index 44dbdeb..0ad12cf 100644 --- a/src/gun.erl +++ b/src/gun.erl @@ -94,6 +94,7 @@ -export([init/1]). -export([not_connected/3]). -export([connected/3]). +-export([terminate/3]). -type req_headers() :: [{binary() | string() | atom(), iodata()}] | #{binary() | string() | atom() => iodata()}. @@ -1077,3 +1078,11 @@ owner_down(normal) -> stop; owner_down(shutdown) -> {stop, shutdown}; owner_down(Shutdown = {shutdown, _}) -> {stop, Shutdown}; owner_down(Reason) -> {stop, {shutdown, {owner_down, Reason}}}. + +terminate(Reason, StateName, #state{event_handler=EventHandler, + event_handler_state=EventHandlerState}) -> + TerminateEvent = #{ + state => StateName, + reason => Reason + }, + EventHandler:terminate(TerminateEvent, EventHandlerState). diff --git a/src/gun_default_event_h.erl b/src/gun_default_event_h.erl index f234dda..6d64ff7 100644 --- a/src/gun_default_event_h.erl +++ b/src/gun_default_event_h.erl @@ -19,6 +19,7 @@ -export([connect_start/2]). -export([connect_end/2]). -export([disconnect/2]). +-export([terminate/2]). init(_EventData, State) -> State. @@ -31,3 +32,6 @@ connect_end(_EventData, State) -> disconnect(_EventData, State) -> State. + +terminate(_EventData, State) -> + State. diff --git a/src/gun_event.erl b/src/gun_event.erl index bb541ed..3d83bea 100644 --- a/src/gun_event.erl +++ b/src/gun_event.erl @@ -51,6 +51,15 @@ -callback disconnect(disconnect_event(), State) -> State. +%% terminate. + +-type terminate_event() :: #{ + state := not_connected | connected, + reason := normal | shutdown | {shutdown, any()} | any() +}. + +-callback terminate(terminate_event(), State) -> State. + %% @todo domain_lookup_start %% @todo domain_lookup_end %% @todo tls_handshake_start @@ -58,7 +67,6 @@ %% @todo origin_changed %% @todo transport_changed %% @todo protocol_changed -%% @todo terminate %% @todo stream_start %% @todo stream_end %% @todo request_start diff --git a/test/event_SUITE.erl b/test/event_SUITE.erl index 50a1ce2..05bff8c 100644 --- a/test/event_SUITE.erl +++ b/test/event_SUITE.erl @@ -115,6 +115,18 @@ disconnect(_) -> } = do_receive_event(disconnect), gun:close(Pid). +terminate(_) -> + doc("Confirm that the terminate event callback is called on terminate."), + Self = self(), + Opts = #{event_handler => {?MODULE, Self}}, + {ok, Pid} = gun:open("localhost", 12345, Opts), + gun:close(Pid), + #{ + state := not_connected, + reason := shutdown + } = do_receive_event(terminate), + ok. + %% Internal. do_receive_event(Event) -> @@ -128,6 +140,9 @@ do_receive_event(Event) -> %% gun_event callbacks. init(EventData, Pid) -> + %% We enable trap_exit to ensure we get a terminate event + %% when we call gun:close/1. + process_flag(trap_exit, true), Pid ! {?FUNCTION_NAME, EventData}, Pid. @@ -142,3 +157,7 @@ connect_end(EventData, Pid) -> disconnect(EventData, Pid) -> Pid ! {?FUNCTION_NAME, EventData}, Pid. + +terminate(EventData, Pid) -> + Pid ! {?FUNCTION_NAME, EventData}, + Pid. |