From cd50a0d3f42afd5e12a1470902a60b4fa9d84f73 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Hoguin?= Date: Fri, 26 Jul 2019 15:25:53 +0200 Subject: Add the origin_changed event --- src/gun.erl | 13 ++++++++++--- src/gun_default_event_h.erl | 4 ++++ src/gun_event.erl | 13 +++++++++++-- test/event_SUITE.erl | 28 +++++++++++++++++++++++++++- 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. -- cgit v1.2.3