diff options
author | Péter Dimitrov <[email protected]> | 2019-06-27 14:24:33 +0200 |
---|---|---|
committer | Péter Dimitrov <[email protected]> | 2019-06-27 15:25:26 +0200 |
commit | 4c7bf834f532b682c92c77a4e4fe171002ee9d7a (patch) | |
tree | 393b227ea81d280db0b057ddf076c6db6a4cdea0 /lib/inets | |
parent | 4319a7f8bc93388ec540e954eb9bb73ea1eec4ef (diff) | |
download | otp-4c7bf834f532b682c92c77a4e4fe171002ee9d7a.tar.gz otp-4c7bf834f532b682c92c77a4e4fe171002ee9d7a.tar.bz2 otp-4c7bf834f532b682c92c77a4e4fe171002ee9d7a.zip |
inets: Return error if URI has no scheme (httpc)
This commit fixes a regression and changes httpc to return
{error, no_scheme} when the request URI has no scheme
e.g. "//foobar".
Diffstat (limited to 'lib/inets')
-rw-r--r-- | lib/inets/src/http_client/httpc.erl | 8 | ||||
-rw-r--r-- | lib/inets/test/httpc_SUITE.erl | 13 |
2 files changed, 16 insertions, 5 deletions
diff --git a/lib/inets/src/http_client/httpc.erl b/lib/inets/src/http_client/httpc.erl index 24a205ced9..9967488f61 100644 --- a/lib/inets/src/http_client/httpc.erl +++ b/lib/inets/src/http_client/httpc.erl @@ -317,7 +317,7 @@ store_cookies(SetCookieHeaders, Url, Profile) {error, Bad, _} -> {error, {parse_failed, Bad}}; URI -> - Scheme = scheme_to_atom(maps:get(scheme, URI, '')), + Scheme = scheme_to_atom(maps:get(scheme, URI, undefined)), Host = maps:get(host, URI, ""), Port = maps:get(port, URI, default_port(Scheme)), Path = uri_string:recompose(#{path => maps:get(path, URI, "")}), @@ -536,7 +536,7 @@ handle_request(Method, Url, BracketedHost = proplists:get_value(ipv6_host_with_brackets, Options), - Scheme = scheme_to_atom(maps:get(scheme, URI, '')), + Scheme = scheme_to_atom(maps:get(scheme, URI, undefined)), Userinfo = maps:get(userinfo, URI, ""), Host = http_util:maybe_add_brackets(maps:get(host, URI, ""), BracketedHost), Port = maps:get(port, URI, default_port(Scheme)), @@ -591,8 +591,8 @@ scheme_to_atom("http") -> http; scheme_to_atom("https") -> https; -scheme_to_atom('') -> - ''; +scheme_to_atom(undefined) -> + throw({error, {no_scheme}}); scheme_to_atom(Scheme) -> throw({error, {bad_scheme, Scheme}}). diff --git a/lib/inets/test/httpc_SUITE.erl b/lib/inets/test/httpc_SUITE.erl index d4b33ae2c6..1d37e71847 100644 --- a/lib/inets/test/httpc_SUITE.erl +++ b/lib/inets/test/httpc_SUITE.erl @@ -106,7 +106,8 @@ real_requests()-> streaming_error, inet_opts, invalid_headers, - invalid_body + invalid_body, + no_scheme ]. real_requests_esi() -> @@ -1231,6 +1232,16 @@ invalid_body(Config) -> ok end. + +%%------------------------------------------------------------------------- + +no_scheme(_Config) -> + {error,{bad_scheme,"ftp"}} = httpc:request("ftp://foobar"), + {error,{no_scheme}} = httpc:request("//foobar"), + {error,{no_scheme}} = httpc:request("foobar"), + ok. + + %%------------------------------------------------------------------------- remote_socket_close(Config) when is_list(Config) -> URL = url(group_name(Config), "/just_close.html", Config), |