aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/gun.erl16
-rw-r--r--test/rfc7231_SUITE.erl35
-rw-r--r--test/socks_SUITE.erl12
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).