aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLoïc Hoguin <[email protected]>2019-07-26 15:25:53 +0200
committerLoïc Hoguin <[email protected]>2019-07-26 15:25:53 +0200
commitcd50a0d3f42afd5e12a1470902a60b4fa9d84f73 (patch)
treef78d527802a4e939de18258eb210b72745944289
parent56b7fdd6eb15564ad821885937b03516a03dce4b (diff)
downloadgun-cd50a0d3f42afd5e12a1470902a60b4fa9d84f73.tar.gz
gun-cd50a0d3f42afd5e12a1470902a60b4fa9d84f73.tar.bz2
gun-cd50a0d3f42afd5e12a1470902a60b4fa9d84f73.zip
Add the origin_changed event
-rw-r--r--src/gun.erl13
-rw-r--r--src/gun_default_event_h.erl4
-rw-r--r--src/gun_event.erl13
-rw-r--r--test/event_SUITE.erl28
4 files changed, 52 insertions, 6 deletions
diff --git a/src/gun.erl b/src/gun.erl
index d158a53..a548a5d 100644
--- a/src/gun.erl
+++ b/src/gun.erl
@@ -1081,8 +1081,14 @@ commands([{state, ProtoState}|Tail], State) ->
%% of the intermediaries properly.
commands([{origin, Scheme, Host, Port, Type}|Tail],
State=#state{transport=Transport, protocol=Protocol,
- origin_host=IntermediateHost, origin_port=IntermediatePort,
- intermediaries=Intermediaries}) ->
+ origin_host=IntermediateHost, origin_port=IntermediatePort, intermediaries=Intermediaries,
+ event_handler=EvHandler, event_handler_state=EvHandlerState0}) ->
+ EvHandlerState = EvHandler:origin_changed(#{
+ type => Type,
+ origin_scheme => Scheme,
+ origin_host => Host,
+ origin_port => Port
+ }, EvHandlerState0),
Info = #{
type => Type,
host => IntermediateHost,
@@ -1091,7 +1097,8 @@ commands([{origin, Scheme, Host, Port, Type}|Tail],
protocol => Protocol:name()
},
commands(Tail, State#state{origin_scheme=Scheme,
- origin_host=Host, origin_port=Port, intermediaries=[Info|Intermediaries]});
+ origin_host=Host, origin_port=Port, intermediaries=[Info|Intermediaries],
+ event_handler_state=EvHandlerState});
commands([{switch_transport, Transport, Socket}|Tail], State=#state{
event_handler=EvHandler, event_handler_state=EvHandlerState0}) ->
EvHandlerState = EvHandler:transport_changed(#{
diff --git a/src/gun_default_event_h.erl b/src/gun_default_event_h.erl
index 579fb20..a146d21 100644
--- a/src/gun_default_event_h.erl
+++ b/src/gun_default_event_h.erl
@@ -40,6 +40,7 @@
-export([ws_send_frame_end/2]).
-export([protocol_changed/2]).
-export([transport_changed/2]).
+-export([origin_changed/2]).
-export([cancel/2]).
-export([disconnect/2]).
-export([terminate/2]).
@@ -119,6 +120,9 @@ protocol_changed(_EventData, State) ->
transport_changed(_EventData, State) ->
State.
+origin_changed(_EventData, State) ->
+ State.
+
cancel(_EventData, State) ->
State.
diff --git a/src/gun_event.erl b/src/gun_event.erl
index 2f12b4c..3520c79 100644
--- a/src/gun_event.erl
+++ b/src/gun_event.erl
@@ -258,6 +258,17 @@
-callback transport_changed(transport_changed_event(), State) -> State.
+%% origin_changed.
+
+-type origin_changed_event() :: #{
+ type := connect,
+ origin_scheme := binary(),
+ origin_host := inet:hostname() | inet:ip_address(),
+ origin_port := inet:port_number()
+}.
+
+-callback origin_changed(origin_changed_event(), State) -> State.
+
%% cancel.
%%
%% In the case of HTTP/1.1 we cannot actually cancel the stream,
@@ -293,5 +304,3 @@
}.
-callback terminate(terminate_event(), State) -> State.
-
-%% @todo origin_changed
diff --git a/test/event_SUITE.erl b/test/event_SUITE.erl
index d593a59..977eec4 100644
--- a/test/event_SUITE.erl
+++ b/test/event_SUITE.erl
@@ -822,7 +822,7 @@ ws_protocol_changed(Config) ->
http1_protocol_changed_connect(Config) ->
doc("Confirm that the protocol_changed event callback is called on CONNECT success "
- "when connecting through a TLS server via a TCP proxy."),
+ "when connecting through a TCP server via a TCP proxy."),
OriginPort = config(tcp_origin_port, Config),
{ok, _, ProxyPort} = rfc7231_SUITE:do_proxy_start(tcp),
{ok, ConnPid} = gun:open("localhost", ProxyPort, #{
@@ -905,6 +905,28 @@ http1_transport_changed_connect_over_https_proxy(Config) ->
true = is_pid(Socket),
gun:close(ConnPid).
+http1_origin_changed_connect(Config) ->
+ doc("Confirm that the origin_changed event callback is called on CONNECT success."),
+ OriginPort = config(tcp_origin_port, Config),
+ {ok, _, ProxyPort} = rfc7231_SUITE:do_proxy_start(tcp),
+ {ok, ConnPid} = gun:open("localhost", ProxyPort, #{
+ event_handler => {?MODULE, self()},
+ protocols => [config(name, config(tc_group_properties, Config))],
+ transport => tcp
+ }),
+ {ok, http} = gun:await_up(ConnPid),
+ _ = gun:connect(ConnPid, #{
+ host => "localhost",
+ port => OriginPort
+ }),
+ #{
+ type := connect,
+ origin_scheme := <<"http">>,
+ origin_host := "localhost",
+ origin_port := OriginPort
+ } = do_receive_event(origin_changed),
+ gun:close(ConnPid).
+
cancel(Config) ->
doc("Confirm that the cancel event callback is called when we cancel a stream."),
{ok, Pid, _} = do_gun_open(Config),
@@ -1095,6 +1117,10 @@ transport_changed(EventData, Pid) ->
Pid ! {?FUNCTION_NAME, EventData},
Pid.
+origin_changed(EventData, Pid) ->
+ Pid ! {?FUNCTION_NAME, EventData},
+ Pid.
+
cancel(EventData, Pid) ->
Pid ! {?FUNCTION_NAME, EventData},
Pid.