From 5043b98d5301e41238afd15d271f5c6b68081b04 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Hoguin?= Date: Mon, 16 Sep 2019 20:02:36 +0200 Subject: Simplify HandshakeEvent --- src/gun.erl | 35 ++++++++++------------------------- src/gun_http.erl | 14 ++++++++------ 2 files changed, 18 insertions(+), 31 deletions(-) diff --git a/src/gun.erl b/src/gun.erl index e41abf8..cc1a2b2 100644 --- a/src/gun.erl +++ b/src/gun.erl @@ -919,13 +919,9 @@ connecting(_, {retries, Retries, LookupInfo}, State=#state{opts=Opts, initial_tls_handshake(_, {retries, Retries, Socket}, State0=#state{opts=Opts}) -> Protocols = maps:get(protocols, Opts, [http2, http]), - TransOpts0 = maps:get(tls_opts, Opts, []), - TransOpts = ensure_alpn(Protocols, TransOpts0), - HandshakeTimeout = maps:get(tls_handshake_timeout, Opts, infinity), HandshakeEvent = #{ - socket => Socket, - tls_opts => TransOpts, - timeout => HandshakeTimeout + tls_opts => ensure_alpn(Protocols, maps:get(tls_opts, Opts, [])), + timeout => maps:get(tls_handshake_timeout, Opts, infinity) }, case normal_tls_handshake(Socket, State0, HandshakeEvent, Protocols) of {ok, TLSSocket, Protocol, State} -> @@ -947,15 +943,8 @@ ensure_alpn(Protocols0, TransOpts) -> |TransOpts]. %% Normal TLS handshake. -tls_handshake(internal, {tls_handshake, StreamRef, ReplyTo, TLSOpts, TLSTimeout, Protocols}, +tls_handshake(internal, {tls_handshake, HandshakeEvent, Protocols}, State0=#state{socket=Socket, transport=gun_tcp, protocol=CurrentProtocol}) -> - HandshakeEvent = #{ - stream_ref => StreamRef, - reply_to => ReplyTo, - socket => Socket, - tls_opts => TLSOpts, - timeout => TLSTimeout - }, case normal_tls_handshake(Socket, State0, HandshakeEvent, Protocols) of {ok, TLSSocket, CurrentProtocol, State1} -> %% We only need to switch the transport when the protocol remains the same. @@ -973,16 +962,11 @@ tls_handshake(internal, {tls_handshake, StreamRef, ReplyTo, TLSOpts, TLSTimeout, end; %% TLS over TLS. %% @todo Protocols -tls_handshake(internal, {tls_handshake, StreamRef, ReplyTo, TLSOpts, TLSTimeout, _Protocols}, State=#state{ - socket=Socket, transport=gun_tls, origin_host=OriginHost, origin_port=OriginPort, +tls_handshake(internal, {tls_handshake, + HandshakeEvent0=#{tls_opts := TLSOpts, timeout := TLSTimeout}, _Protocols}, + State=#state{socket=Socket, transport=gun_tls, origin_host=OriginHost, origin_port=OriginPort, event_handler=EvHandler, event_handler_state=EvHandlerState0}) -> - HandshakeEvent = #{ - stream_ref => StreamRef, - reply_to => ReplyTo, - socket => Socket, - tls_opts => TLSOpts, - timeout => TLSTimeout - }, + HandshakeEvent = HandshakeEvent0#{socket => Socket}, EvHandlerState = EvHandler:tls_handshake_start(HandshakeEvent, EvHandlerState0), {ok, ProxyPid} = gun_tls_proxy:start_link(OriginHost, OriginPort, TLSOpts, TLSTimeout, Socket, gun_tls, HandshakeEvent), @@ -1019,7 +1003,8 @@ tls_handshake(Type, Event, State) -> handle_common_connected(Type, Event, ?FUNCTION_NAME, State). normal_tls_handshake(Socket, State=#state{event_handler=EvHandler, event_handler_state=EvHandlerState0}, - HandshakeEvent=#{tls_opts := TLSOpts, timeout := TLSTimeout}, Protocols) -> + HandshakeEvent0=#{tls_opts := TLSOpts, timeout := TLSTimeout}, Protocols) -> + HandshakeEvent = HandshakeEvent0#{socket => Socket}, EvHandlerState1 = EvHandler:tls_handshake_start(HandshakeEvent, EvHandlerState0), case gun_tls:connect(Socket, TLSOpts, TLSTimeout) of {ok, TLSSocket} -> @@ -1334,7 +1319,7 @@ commands([{switch_protocol, Protocol, _ProtoState0}|Tail], State=#state{ commands(Tail, keepalive_timeout(State#state{protocol=Protocol, protocol_state=ProtoState, event_handler_state=EvHandlerState})); %% Perform a TLS handshake. -commands([TLSHandshake={tls_handshake, _, _, _, _, _}], State) -> +commands([TLSHandshake={tls_handshake, _, _}], State) -> {next_state, tls_handshake, State, {next_event, internal, TLSHandshake}}; %% Switch from not_fully_connected to connected. diff --git a/src/gun_http.erl b/src/gun_http.erl index 59b127f..576c013 100644 --- a/src/gun_http.erl +++ b/src/gun_http.erl @@ -298,12 +298,14 @@ handle_head(Data, State=#http_state{version=ClientVersion, content_handlers=Hand Protocols = maps:get(protocols, Destination, [http]), case Destination of #{transport := tls} -> - TLSOpts = maps:get(tls_opts, Destination, []), - TLSTimeout = maps:get(tls_handshake_timeout, Destination, infinity), - {[ - {origin, <<"https">>, NewHost, NewPort, connect}, - {tls_handshake, RealStreamRef, ReplyTo, TLSOpts, TLSTimeout, Protocols} - ], EvHandlerState1}; + HandshakeEvent = #{ + stream_ref => RealStreamRef, + reply_to => ReplyTo, + tls_opts => maps:get(tls_opts, Destination, []), + timeout => maps:get(tls_handshake_timeout, Destination, infinity) + }, + {[{origin, <<"https">>, NewHost, NewPort, connect}, + {tls_handshake, HandshakeEvent, Protocols}], EvHandlerState1}; _ -> case Protocols of [http] -> -- cgit v1.2.3