From a1fbe90a7cb2eb65b415842188e66687ee45d9d2 Mon Sep 17 00:00:00 2001 From: Julius Andrikonis Date: Tue, 13 Feb 2024 11:18:35 +0200 Subject: [PATCH 1/2] HTTP and HTTPS proxies may be different --- include/hackney.hrl | 3 ++- src/hackney.erl | 21 ++++++++++++--------- 2 files changed, 14 insertions(+), 10 deletions(-) diff --git a/include/hackney.hrl b/include/hackney.hrl index d2c970c1..744da0d7 100644 --- a/include/hackney.hrl +++ b/include/hackney.hrl @@ -57,4 +57,5 @@ -define(CONNECTIONS, hackney_connections). --define(PROXY_ENV_VARS, ["http_proxy", "https_proxy", "HTTP_PROXY", "HTTPS_PROXY"]). +-define(HTTP_PROXY_ENV_VARS, ["http_proxy", "HTTP_PROXY"]). +-define(HTTPS_PROXY_ENV_VARS, ["https_proxy", "HTTPS_PROXY"]). diff --git a/src/hackney.erl b/src/hackney.erl index 6a88b1b8..7dbef235 100644 --- a/src/hackney.erl +++ b/src/hackney.erl @@ -320,7 +320,8 @@ request(Method, #hackney_url{}=URL0, Headers0, Body, Options0) -> host = Host, port = Port, user = User, - password = Password} = URL, + password = Password, + scheme = Scheme} = URL, Options = case User of <<>> -> @@ -332,7 +333,7 @@ request(Method, #hackney_url{}=URL0, Headers0, Body, Options0) -> Headers1 = hackney_headers_new:new(Headers0), - case maybe_proxy(Transport, Host, Port, Options) of + case maybe_proxy(Transport, Scheme, Host, Port, Options) of {ok, Ref, AbsolutePath} -> Request = make_request( Method, URL, Headers1, Body, Options, AbsolutePath @@ -615,7 +616,7 @@ make_request(Method, #hackney_url{}=URL, Headers, Body, _, _) -> {Method, FinalPath, Headers1, Body}. -maybe_proxy(Transport, Host, Port, Options) +maybe_proxy(Transport, Scheme, Host, Port, Options) when is_list(Host), is_integer(Port), is_list(Options) -> case proplists:get_value(proxy, Options) of Url when is_binary(Url) orelse is_list(Url) -> @@ -671,14 +672,14 @@ maybe_proxy(Transport, Host, Port, Options) NoProxyEnv = proplists:get_value( no_proxy_env, Options, application:get_env(hackney, no_proxy_env, false) ), - maybe_proxy_from_env(Transport, Host, Port, Options, NoProxyEnv) + maybe_proxy_from_env(Transport, Scheme, Host, Port, Options, NoProxyEnv) end. -maybe_proxy_from_env(Transport, Host, Port, Options, true) -> +maybe_proxy_from_env(Transport, _Scheme, Host, Port, Options, true) -> ?report_debug("request without proxy", []), hackney_connect:connect(Transport, Host, Port, Options, true); -maybe_proxy_from_env(Transport, Host, Port, Options, _) -> - case get_proxy_env() of +maybe_proxy_from_env(Transport, Scheme, Host, Port, Options, _) -> + case get_proxy_env(Scheme) of {ok, Url} -> proxy_from_url(Url, Transport, Host, Port, Options); false -> @@ -704,8 +705,10 @@ proxy_from_url(Url, Transport, Host, Port, Options) -> end end. -get_proxy_env() -> - get_proxy_env(?PROXY_ENV_VARS). +get_proxy_env(https) -> + get_proxy_env(?HTTPS_PROXY_ENV_VARS); +get_proxy_env(S) when S =:= http; S =:= http_unix -> + get_proxy_env(?HTTP_PROXY_ENV_VARS); get_proxy_env([Var | Rest]) -> case os:getenv(Var) of From b7993e8020c9f1cfe5eef52844446b5f667f53c6 Mon Sep 17 00:00:00 2001 From: Julius Andrikonis Date: Tue, 13 Feb 2024 11:19:34 +0200 Subject: [PATCH 2/2] ALL_PROXY env variable support --- include/hackney.hrl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/include/hackney.hrl b/include/hackney.hrl index 744da0d7..b26951ee 100644 --- a/include/hackney.hrl +++ b/include/hackney.hrl @@ -57,5 +57,5 @@ -define(CONNECTIONS, hackney_connections). --define(HTTP_PROXY_ENV_VARS, ["http_proxy", "HTTP_PROXY"]). --define(HTTPS_PROXY_ENV_VARS, ["https_proxy", "HTTPS_PROXY"]). +-define(HTTP_PROXY_ENV_VARS, ["http_proxy", "HTTP_PROXY", "all_proxy", "ALL_PROXY"]). +-define(HTTPS_PROXY_ENV_VARS, ["https_proxy", "HTTPS_PROXY", "all_proxy", "ALL_PROXY"]).