diff options
author | Loïc Hoguin <[email protected]> | 2020-03-28 11:54:06 +0100 |
---|---|---|
committer | Loïc Hoguin <[email protected]> | 2020-03-28 11:54:06 +0100 |
commit | 310f01593f7efcafdbb416748028f164e19ad1e0 (patch) | |
tree | 730f0bbf2211730d1e78064e5d90d61ca8077c4b | |
parent | e3ca88e6111d2837f21741f410ce58381079e78a (diff) | |
download | gun-310f01593f7efcafdbb416748028f164e19ad1e0.tar.gz gun-310f01593f7efcafdbb416748028f164e19ad1e0.tar.bz2 gun-310f01593f7efcafdbb416748028f164e19ad1e0.zip |
Make intermediaries return tls not tls_proxy
Also add a test for CONNECT to TLS via 2 TLS proxies.
-rw-r--r-- | src/gun.erl | 16 | ||||
-rw-r--r-- | test/rfc7231_SUITE.erl | 35 | ||||
-rw-r--r-- | test/socks_SUITE.erl | 12 |
3 files changed, 40 insertions, 23 deletions
diff --git a/src/gun.erl b/src/gun.erl index 3255c67..998ce6b 100644 --- a/src/gun.erl +++ b/src/gun.erl @@ -434,8 +434,7 @@ info(ServerPid) -> origin_scheme => OriginScheme, origin_host => OriginHost, origin_port => OriginPort, - %% Intermediaries are listed in the order data goes through them. - intermediaries => lists:reverse(Intermediaries), + intermediaries => intermediaries_info(Intermediaries, []), cookie_store => CookieStore }, Info = case Socket of @@ -457,6 +456,19 @@ info(ServerPid) -> _ -> Info#{protocol => Protocol:name()} end. +%% We change tls_proxy into tls for intermediaries. +%% +%% Intermediaries are listed in the order data goes through them, +%% that's why we reverse the order here. +intermediaries_info([], Acc) -> + Acc; +intermediaries_info([Intermediary=#{transport := Transport0}|Tail], Acc) -> + Transport = case Transport0 of + tls_proxy -> tls; + _ -> Transport0 + end, + intermediaries_info(Tail, [Intermediary#{transport => Transport}|Acc]). + -spec close(pid()) -> ok. close(ServerPid) -> supervisor:terminate_child(gun_sup, ServerPid). diff --git a/test/rfc7231_SUITE.erl b/test/rfc7231_SUITE.erl index ec63cbe..c2f3da6 100644 --- a/test/rfc7231_SUITE.erl +++ b/test/rfc7231_SUITE.erl @@ -240,26 +240,39 @@ do_connect_h2(OriginScheme, OriginTransport, ProxyTransport) -> }]} = gun:info(ConnPid), gun:close(ConnPid). -connect_through_multiple_proxies(_) -> +connect_tcp_through_multiple_tcp_proxies(_) -> doc("CONNECT can be used to establish a TCP connection " "to an HTTP/1.1 server via a tunnel going through " "two separate HTTP proxies. (RFC7231 4.3.6)"), - {ok, OriginPid, OriginPort} = init_origin(tcp), - {ok, Proxy1Pid, Proxy1Port} = do_proxy_start(tcp), - {ok, Proxy2Pid, Proxy2Port} = do_proxy_start(tcp), - {ok, ConnPid} = gun:open("localhost", Proxy1Port), + do_connect_through_multiple_proxies(<<"http">>, tcp, tcp). + +connect_tls_through_multiple_tls_proxies(_) -> + doc("CONNECT can be used to establish a TLS connection " + "to an HTTP/1.1 server via a tunnel going through " + "two separate HTTPS proxies. (RFC7231 4.3.6)"), + do_connect_through_multiple_proxies(<<"https">>, tls, tls). + +do_connect_through_multiple_proxies(OriginScheme, OriginTransport, ProxiesTransport) -> + {ok, OriginPid, OriginPort} = init_origin(OriginTransport), + {ok, Proxy1Pid, Proxy1Port} = do_proxy_start(ProxiesTransport), + {ok, Proxy2Pid, Proxy2Port} = do_proxy_start(ProxiesTransport), + {ok, ConnPid} = gun:open("localhost", Proxy1Port, #{ + transport => ProxiesTransport + }), {ok, http} = gun:await_up(ConnPid), Authority1 = iolist_to_binary(["localhost:", integer_to_binary(Proxy2Port)]), StreamRef1 = gun:connect(ConnPid, #{ host => "localhost", - port => Proxy2Port + port => Proxy2Port, + transport => ProxiesTransport }), {request, <<"CONNECT">>, Authority1, 'HTTP/1.1', _} = receive_from(Proxy1Pid), {response, fin, 200, _} = gun:await(ConnPid, StreamRef1), Authority2 = iolist_to_binary(["localhost:", integer_to_binary(OriginPort)]), StreamRef2 = gun:connect(ConnPid, #{ host => "localhost", - port => OriginPort + port => OriginPort, + transport => OriginTransport }), {request, <<"CONNECT">>, Authority2, 'HTTP/1.1', _} = receive_from(Proxy2Pid), {response, fin, 200, _} = gun:await(ConnPid, StreamRef2), @@ -269,22 +282,22 @@ connect_through_multiple_proxies(_) -> Lines = binary:split(Data, <<"\r\n">>, [global]), [<<"host: ", Authority2/bits>>] = [L || <<"host: ", _/bits>> = L <- Lines], #{ - transport := tcp, + transport := OriginTransport, protocol := http, - origin_scheme := <<"http">>, + origin_scheme := OriginScheme, origin_host := "localhost", origin_port := OriginPort, intermediaries := [#{ type := connect, host := "localhost", port := Proxy1Port, - transport := tcp, + transport := ProxiesTransport, protocol := http }, #{ type := connect, host := "localhost", port := Proxy2Port, - transport := tcp, + transport := ProxiesTransport, protocol := http }]} = gun:info(ConnPid), gun:close(ConnPid). diff --git a/test/socks_SUITE.erl b/test/socks_SUITE.erl index ec184a6..e692a82 100644 --- a/test/socks_SUITE.erl +++ b/test/socks_SUITE.erl @@ -315,10 +315,6 @@ do_socks5_through_multiple_proxies(OriginScheme, OriginTransport, ProxyTransport Data = receive_from(OriginPid), Lines = binary:split(Data, <<"\r\n">>, [global]), [<<"host: ", Authority/bits>>] = [L || <<"host: ", _/bits>> = L <- Lines], - Proxy2Transport = case ProxyTransport of - tcp -> tcp; - tls -> tls_proxy - end, #{ transport := OriginTransport, protocol := http, @@ -335,7 +331,7 @@ do_socks5_through_multiple_proxies(OriginScheme, OriginTransport, ProxyTransport type := socks5, host := "localhost", port := Proxy2Port, - transport := Proxy2Transport, + transport := ProxyTransport, protocol := socks }]} = gun:info(ConnPid), gun:close(ConnPid). @@ -397,10 +393,6 @@ do_socks5_through_connect_proxy(OriginScheme, OriginTransport, ProxyTransport) - Data = receive_from(OriginPid), Lines = binary:split(Data, <<"\r\n">>, [global]), [<<"host: ", Authority2/bits>>] = [L || <<"host: ", _/bits>> = L <- Lines], - Proxy2Transport = case ProxyTransport of - tcp -> tcp; - tls -> tls_proxy - end, #{ transport := OriginTransport, protocol := http, @@ -417,7 +409,7 @@ do_socks5_through_connect_proxy(OriginScheme, OriginTransport, ProxyTransport) - type := socks5, host := "localhost", port := Proxy2Port, - transport := Proxy2Transport, + transport := ProxyTransport, protocol := socks }]} = gun:info(ConnPid), gun:close(ConnPid). |