summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xbootstrap29
-rw-r--r--src/rebar3.erl3
-rw-r--r--src/rebar_pkg_resource.erl4
-rw-r--r--src/rebar_utils.erl24
-rw-r--r--test/rebar_utils_SUITE.erl18
5 files changed, 55 insertions, 23 deletions
diff --git a/bootstrap b/bootstrap
index 9190c6b..c7f0e06 100755
--- a/bootstrap
+++ b/bootstrap
@@ -150,8 +150,9 @@ set_httpc_options(_, []) ->
ok;
set_httpc_options(Scheme, Proxy) ->
- {ok, {_, _, Host, Port, _, _}} = http_uri:parse(Proxy),
- httpc:set_options([{Scheme, {{Host, Port}, []}}], rebar).
+ {ok, {_, UserInfo, Host, Port, _, _}} = http_uri:parse(Proxy),
+ httpc:set_options([{Scheme, {{Host, Port}, []}}], rebar),
+ set_proxy_auth(UserInfo).
compile(App, FirstFiles) ->
Dir = filename:join(filename:absname("_build/default/lib/"), App),
@@ -406,22 +407,18 @@ otp_release1(Rel) ->
end
end.
-%% extracts username and password from HTTPS_PROXY and returns them as tuple
-get_proxy_auth() ->
- get_proxy_auth(get_http_vars(https_proxy)).
-
-get_proxy_auth([]) ->
- [];
-get_proxy_auth(HttpsProxy) ->
- {ok, {_, UserInfo, _, _, _, _}} = http_uri:parse(HttpsProxy),
- parse_user_info(UserInfo).
-
-parse_user_info([]) ->
- [];
-parse_user_info(UserInfo) ->
+set_proxy_auth([]) ->
+ ok;
+set_proxy_auth(UserInfo) ->
Idx = string:chr(UserInfo, $:),
Username = string:sub_string(UserInfo, 1, Idx-1),
Password = string:sub_string(UserInfo, Idx+1),
%% password may contain url encoded characters, need to decode them first
- [{proxy_auth, {Username, http_uri:decode(Password)}}].
+ put(proxy_auth, [{proxy_auth, {Username, http_uri:decode(Password)}}]).
+
+get_proxy_auth() ->
+ case get(proxy_auth) of
+ undefined -> [];
+ ProxyAuth -> ProxyAuth
+ end.
diff --git a/src/rebar3.erl b/src/rebar3.erl
index 4e7e284..1059904 100644
--- a/src/rebar3.erl
+++ b/src/rebar3.erl
@@ -145,6 +145,8 @@ run_aux(State, RawArgs) ->
rebar_core:init_command(rebar_state:command_args(State10, Args), Task).
init_config() ->
+ rebar_utils:set_httpc_options(),
+
%% Initialize logging system
Verbosity = log_level(),
ok = rebar_log:init(command_line, Verbosity),
@@ -320,7 +322,6 @@ ensure_running(App, Caller) ->
end.
state_from_global_config(Config, GlobalConfigFile) ->
- rebar_utils:set_httpc_options(),
GlobalConfigTerms = rebar_config:consult_file(GlobalConfigFile),
GlobalConfig = rebar_state:new(GlobalConfigTerms),
diff --git a/src/rebar_pkg_resource.erl b/src/rebar_pkg_resource.erl
index 5817817..8e1713d 100644
--- a/src/rebar_pkg_resource.erl
+++ b/src/rebar_pkg_resource.erl
@@ -107,8 +107,10 @@ make_vsn(_) ->
{error, "Replacing version of type pkg not supported."}.
request(Url, ETag) ->
+ HttpOptions = [{ssl, ssl_opts(Url)}, {relaxed, true} | rebar_utils:get_proxy_auth()],
+
case httpc:request(get, {Url, [{"if-none-match", ETag} || ETag =/= false]++[{"User-Agent", rebar_utils:user_agent()}]},
- [{ssl, ssl_opts(Url)}, {relaxed, true}],
+ HttpOptions,
[{body_format, binary}],
rebar) of
{ok, {{_Version, 200, _Reason}, Headers, Body}} ->
diff --git a/src/rebar_utils.erl b/src/rebar_utils.erl
index f55f40f..4b43911 100644
--- a/src/rebar_utils.erl
+++ b/src/rebar_utils.erl
@@ -70,7 +70,9 @@
info_useless/2,
list_dir/1,
user_agent/0,
- reread_config/1]).
+ reread_config/1,
+ get_proxy_auth/0,
+ set_proxy_auth/1]).
%% for internal use only
-export([otp_release/0]).
@@ -825,8 +827,9 @@ set_httpc_options(_, []) ->
ok;
set_httpc_options(Scheme, Proxy) ->
- {ok, {_, _, Host, Port, _, _}} = http_uri:parse(Proxy),
- httpc:set_options([{Scheme, {{Host, Port}, []}}], rebar).
+ {ok, {_, UserInfo, Host, Port, _, _}} = http_uri:parse(Proxy),
+ httpc:set_options([{Scheme, {{Host, Port}, []}}], rebar),
+ set_proxy_auth(UserInfo).
url_append_path(Url, ExtraPath) ->
case http_uri:parse(Url) of
@@ -865,3 +868,18 @@ list_dir(Dir) ->
true -> file:list_dir_all(Dir);
false -> file:list_dir(Dir)
end.
+
+set_proxy_auth([]) ->
+ ok;
+set_proxy_auth(UserInfo) ->
+ Idx = string:chr(UserInfo, $:),
+ Username = string:sub_string(UserInfo, 1, Idx-1),
+ Password = string:sub_string(UserInfo, Idx+1),
+ %% password may contain url encoded characters, need to decode them first
+ application:set_env(rebar, proxy_auth, [{proxy_auth, {Username, http_uri:decode(Password)}}]).
+
+get_proxy_auth() ->
+ case application:get_env(rebar, proxy_auth) of
+ undefined -> [];
+ {ok, ProxyAuth} -> ProxyAuth
+ end.
diff --git a/test/rebar_utils_SUITE.erl b/test/rebar_utils_SUITE.erl
index b32992d..0d496a3 100644
--- a/test/rebar_utils_SUITE.erl
+++ b/test/rebar_utils_SUITE.erl
@@ -31,7 +31,8 @@
nonblacklisted_otp_version/1,
blacklisted_otp_version/1,
sh_does_not_miss_messages/1,
- tup_merge/1]).
+ tup_merge/1,
+ proxy_auth/1]).
-include_lib("common_test/include/ct.hrl").
-include_lib("eunit/include/eunit.hrl").
@@ -46,7 +47,8 @@ end_per_testcase(_, _Config) ->
all() ->
[{group, args_to_tasks},
sh_does_not_miss_messages,
- tup_merge].
+ tup_merge,
+ proxy_auth].
groups() ->
[{args_to_tasks, [], [empty_arglist,
@@ -272,3 +274,15 @@ tup_merge(_Config) ->
rebar_utils:tup_sort([{a,a},{a,a,a},a,{b,a,a},b,{z,a},{z,a,a},{b,a},z])
)
).
+
+proxy_auth(_Config) ->
+ %% proxy auth with regular username/password
+ rebar_utils:set_proxy_auth("Username", "Password"),
+ ?assertEqual([{proxy_auth, {"Username", "Password"}}],
+ rebar_utils:get_proxy_auth()),
+ %% proxy auth with username missing and url encoded password
+ rebar_utils:set_proxy_auth("", "?!abc#$"),
+ ?assertEqual([{proxy_auth, {"", "%3F!abc%23%24"}}],
+ rebar_utils:get_proxy_auth()).
+
+