From 492c955819eec864e3f3ea2760d3ee7800851356 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Hoguin?= Date: Thu, 12 Nov 2020 15:27:07 +0100 Subject: Return 'undefined' for raw|socks origin_scheme where applicable --- doc/src/manual/gun.stream_info.asciidoc | 2 +- src/gun.erl | 9 +++++++-- src/gun_http2.erl | 10 ++++++---- src/gun_socks.erl | 3 ++- src/gun_tunnel.erl | 16 +++++++++------- test/raw_SUITE.erl | 10 +++++----- test/tunnel_SUITE.erl | 8 ++++---- 7 files changed, 34 insertions(+), 24 deletions(-) diff --git a/doc/src/manual/gun.stream_info.asciidoc b/doc/src/manual/gun.stream_info.asciidoc index 26ec8e2..de09cb5 100644 --- a/doc/src/manual/gun.stream_info.asciidoc +++ b/doc/src/manual/gun.stream_info.asciidoc @@ -29,7 +29,7 @@ Intermediary :: #{ Tunnel :: #{ transport => tcp | tls, protocol => http | http2 | socks | raw, - origin_scheme => binary(), + origin_scheme => binary() | undefined, origin_host => inet:hostname() | inet:ip_address(), origin_port => inet:port_number() } diff --git a/src/gun.erl b/src/gun.erl index ddb5007..6251dc7 100644 --- a/src/gun.erl +++ b/src/gun.erl @@ -466,6 +466,7 @@ info(ServerPid) -> end, origin_scheme => case Protocol of gun_raw -> undefined; + gun_socks -> undefined; _ -> OriginScheme end, origin_host => OriginHost, @@ -943,7 +944,8 @@ start_link(Owner, Host, Port, Opts) -> init({Owner, Host, Port, Opts}) -> Retry = maps:get(retry, Opts, 5), OriginTransport = maps:get(transport, Opts, default_transport(Port)), - %% @todo The OriginScheme is not http when we connect to socks/raw. + %% The OriginScheme is not really http when we connect to socks/raw. + %% This is corrected in the gun:info/1 and gun:stream_info/2 functions where applicable. {OriginScheme, Transport} = case OriginTransport of tcp -> {<<"http">>, gun_tcp}; tls -> {<<"https">>, gun_tls} @@ -1542,7 +1544,10 @@ tunnel_info_from_state(#state{origin_scheme=OriginScheme, <<"https">> -> tls end, protocol => Proto:name(), - origin_scheme => OriginScheme, + origin_scheme => case Proto of + gun_raw -> undefined; + _ -> OriginScheme + end, origin_host => OriginHost, origin_port => OriginPort }. diff --git a/src/gun_http2.erl b/src/gun_http2.erl index 9c8e094..2778b4f 100644 --- a/src/gun_http2.erl +++ b/src/gun_http2.erl @@ -1256,16 +1256,18 @@ stream_info(State, StreamRef) when is_reference(StreamRef) -> info=#{origin_host := OriginHost, origin_port := OriginPort}, protocol=Proto, protocol_state=ProtoState}} -> Transport = maps:get(transport, Destination, tcp), + Protocol = Proto:tunneled_name(ProtoState, true), {ok, #{ ref => StreamRef, reply_to => ReplyTo, state => running, tunnel => #{ transport => Transport, - protocol => Proto:tunneled_name(ProtoState, true), - origin_scheme => case Transport of - tcp -> <<"http">>; - tls -> <<"https">> + protocol => Protocol, + origin_scheme => case {Transport, Protocol} of + {_, raw} -> undefined; + {tcp, _} -> <<"http">>; + {tls, _} -> <<"https">> end, origin_host => OriginHost, origin_port => OriginPort diff --git a/src/gun_socks.erl b/src/gun_socks.erl index cda4f98..541949f 100644 --- a/src/gun_socks.erl +++ b/src/gun_socks.erl @@ -137,7 +137,8 @@ handle(<<5, 0, 0, Rest0/bits>>, #socks_state{ref=StreamRef, reply_to=ReplyTo, op end, %% @todo Maybe an event indicating success. #{host := NewHost, port := NewPort} = Opts, - %% @todo The origin scheme is wrong when the next protocol is not HTTP. + %% There is no origin scheme when not using HTTP but we act as if + %% there is and simply correct the value in the info functions. case Opts of #{transport := tls} -> HandshakeEvent0 = #{ diff --git a/src/gun_tunnel.erl b/src/gun_tunnel.erl index 72f97f7..43e8767 100644 --- a/src/gun_tunnel.erl +++ b/src/gun_tunnel.erl @@ -362,19 +362,21 @@ stream_info(#tunnel_state{transport=Transport0, stream_ref=TunnelStreamRef, repl gun_tcp_proxy -> tcp; gun_tls_proxy -> tls end, + Protocol = case Proto of + gun_tunnel -> Proto:tunneled_name(ProtoState, false); + _ -> Proto:name() + end, {ok, #{ ref => TunnelStreamRef, reply_to => ReplyTo, state => running, tunnel => #{ transport => Transport, - protocol => case Proto of - gun_tunnel -> Proto:tunneled_name(ProtoState, false); - _ -> Proto:name() - end, - origin_scheme => case Transport of - tcp -> <<"http">>; - tls -> <<"https">> + protocol => Protocol, + origin_scheme => case {Transport, Protocol} of + {_, raw} -> undefined; + {tcp, _} -> <<"http">>; + {tls, _} -> <<"https">> end, origin_host => OriginHost, origin_port => OriginPort diff --git a/test/raw_SUITE.erl b/test/raw_SUITE.erl index fc25f5d..00765ac 100644 --- a/test/raw_SUITE.erl +++ b/test/raw_SUITE.erl @@ -50,7 +50,7 @@ do_direct_raw(OriginTransport) -> #{ transport := OriginTransport, protocol := raw, - origin_scheme := _, %% @todo This should be 'undefined'. + origin_scheme := undefined, origin_host := "localhost", origin_port := OriginPort, intermediaries := [] @@ -98,7 +98,7 @@ do_socks5_raw(OriginTransport, ProxyTransport) -> #{ transport := OriginTransport, protocol := raw, - origin_scheme := _, %% @todo This should be 'undefined'. + origin_scheme := undefined, origin_host := "localhost", origin_port := OriginPort, intermediaries := [#{ @@ -147,7 +147,7 @@ do_connect_raw(OriginTransport, ProxyTransport) -> #{ transport := OriginTransport, protocol := raw, - origin_scheme := _, %% @todo This should be 'undefined'. + origin_scheme := undefined, origin_host := "localhost", origin_port := OriginPort, intermediaries := [#{ @@ -223,7 +223,7 @@ do_http11_upgrade_raw(OriginTransport) -> #{ transport := OriginTransport, protocol := raw, - origin_scheme := _, %% @todo This should be 'undefined'. + origin_scheme := undefined, origin_host := "localhost", origin_port := OriginPort, intermediaries := [] @@ -315,7 +315,7 @@ do_http2_connect_raw(OriginTransport, ProxyScheme, ProxyTransport) -> tunnel := #{ transport := OriginTransport, protocol := raw, - origin_scheme := _, %% @todo This should be 'undefined'. + origin_scheme := undefined, origin_host := "localhost", origin_port := OriginPort } diff --git a/test/tunnel_SUITE.erl b/test/tunnel_SUITE.erl index 24fb813..aaf21a6 100644 --- a/test/tunnel_SUITE.erl +++ b/test/tunnel_SUITE.erl @@ -978,10 +978,10 @@ do_proxy2_stream_info(#st{proxy1=Proxy1, proxy1_port=Proxy1Port, proxy2=Proxy2, _ -> connect end, {OriginTransport, OriginProtocol} = do_type(Origin), - %% @todo The OriginScheme should probably be undefined if Origin is raw|rawtls. - OriginScheme = case OriginTransport of - tcp -> <<"http">>; - tls -> <<"https">> + OriginScheme = case {OriginTransport, OriginProtocol} of + {_, raw} -> undefined; + {tcp, _} -> <<"http">>; + {tls, _} -> <<"https">> end, {ok, #{ ref := StreamRef2, -- cgit v1.2.3