aboutsummaryrefslogtreecommitdiffstats
path: root/src/gun.erl
diff options
context:
space:
mode:
authorLoïc Hoguin <[email protected]>2019-07-26 12:35:38 +0200
committerLoïc Hoguin <[email protected]>2019-07-26 12:36:55 +0200
commite4df3bb7c726571640c2799bc7a6fbb687b3bdae (patch)
tree1f044ea876852c876846a9d518c97e35cb535e53 /src/gun.erl
parentc2ba2258a0020d82faa3e79162f05fc67d61b53e (diff)
downloadgun-e4df3bb7c726571640c2799bc7a6fbb687b3bdae.tar.gz
gun-e4df3bb7c726571640c2799bc7a6fbb687b3bdae.tar.bz2
gun-e4df3bb7c726571640c2799bc7a6fbb687b3bdae.zip
Add tls_handshake events for CONNECT through TLS proxies
Diffstat (limited to 'src/gun.erl')
-rw-r--r--src/gun.erl24
1 files changed, 19 insertions, 5 deletions
diff --git a/src/gun.erl b/src/gun.erl
index 9add685..ada6272 100644
--- a/src/gun.erl
+++ b/src/gun.erl
@@ -968,11 +968,25 @@ connected(cast, {connect, ReplyTo, StreamRef, Destination0, Headers},
ProtoState2 = Protocol:connect(ProtoState, StreamRef, ReplyTo, Destination, Headers),
{keep_state, State#state{protocol_state=ProtoState2}};
%% When using gun_tls_proxy we need a separate message to know whether
-%% we need to switch to a different protocol.
-connected(info, {connect_protocol, Protocol}, #state{protocol=Protocol}) ->
- keep_state_and_data;
-connected(info, {connect_protocol, Protocol}, State=#state{protocol_state=ProtoState}) ->
- commands([{switch_protocol, Protocol, ProtoState}], State);
+%% the handshake succeeded and whether we need to switch to a different protocol.
+connected(info, {gun_tls_proxy, Socket, {ok, NewProtocol}, HandshakeEvent},
+ State0=#state{socket=Socket, protocol=CurrentProtocol, protocol_state=ProtoState,
+ event_handler=EvHandler, event_handler_state=EvHandlerState0}) ->
+ EvHandlerState = EvHandler:tls_handshake_end(HandshakeEvent#{
+ socket => Socket,
+ protocol => NewProtocol:name()
+ }, EvHandlerState0),
+ State = State0#state{event_handler_state=EvHandlerState},
+ case NewProtocol of
+ CurrentProtocol -> {keep_state, State};
+ _ -> commands([{switch_protocol, NewProtocol, ProtoState}], State)
+ end;
+connected(info, {gun_tls_proxy, Socket, Error = {error, Reason}, HandshakeEvent},
+ State=#state{socket=Socket, event_handler=EvHandler, event_handler_state=EvHandlerState0}) ->
+ EvHandlerState = EvHandler:tls_handshake_end(HandshakeEvent#{
+ error => Reason
+ }, EvHandlerState0),
+ commands([Error], State#state{event_handler_state=EvHandlerState});
connected(cast, {cancel, ReplyTo, StreamRef}, State=#state{
protocol=Protocol, protocol_state=ProtoState,
event_handler=EvHandler, event_handler_state=EvHandlerState0}) ->