summaryrefslogtreecommitdiff
path: root/lib/inets
diff options
context:
space:
mode:
Diffstat (limited to 'lib/inets')
-rw-r--r--lib/inets/src/http_server/mod_dir.erl21
-rw-r--r--lib/inets/test/httpd_SUITE.erl20
-rw-r--r--lib/inets/test/httpd_test_lib.erl17
3 files changed, 44 insertions, 14 deletions
diff --git a/lib/inets/src/http_server/mod_dir.erl b/lib/inets/src/http_server/mod_dir.erl
index 1d2d44fc82..d81c6cc4c3 100644
--- a/lib/inets/src/http_server/mod_dir.erl
+++ b/lib/inets/src/http_server/mod_dir.erl
@@ -135,7 +135,7 @@ format(Path,RequestURI) ->
io_lib:format("<IMG SRC=\"~s\" ALT=\"[~s]\">"
" <A HREF=\"~s\">Parent directory</A> "
" ~2.2.0w-~s-~w ~2.2.0w:~2.2.0w -\n",
- [icon(back),"DIR",get_href(RequestURI),Day,
+ [icon(back),"DIR",percent_encode(RequestURI),Day,
httpd_util:month(Month),Year,Hour,Minute]).
%% body
@@ -159,7 +159,7 @@ format(Path,RequestURI,ConfigDB,InitEntry) ->
"<A HREF=\"~s\">~-21.s..</A>"
"~*.*c~2.2.0w-~s-~w ~2.2.0w:~2.2.0w"
" -\n", [icon(folder),"DIR",
- get_href(RequestURI++"/"++InitEntry++"/"),
+ RequestURI ++ "/" ++ percent_encode(InitEntry) ++ "/",
Entry, 23-21, 23-21, $ ,
Day, httpd_util:month(Month),
Year,Hour,Minute]);
@@ -167,8 +167,8 @@ format(Path,RequestURI,ConfigDB,InitEntry) ->
io_lib:format("<IMG SRC=\"~s\" ALT=\"[~s]\">"
" <A HREF=\"~s\">~s</A>~*.*c~2.2.0"
"w-~s-~w ~2.2.0w:~2.2.0w -\n",
- [icon(folder),"DIR",get_href(RequestURI ++ "/" ++
- InitEntry ++ "/"),Entry,
+ [icon(folder),"DIR",
+ RequestURI ++ "/" ++ percent_encode(InitEntry) ++ "/",Entry,
23-EntryLength,23-EntryLength,$ ,Day,
httpd_util:month(Month),Year,Hour,Minute])
end;
@@ -183,8 +183,8 @@ format(Path,RequestURI,ConfigDB,InitEntry) ->
io_lib:format("<IMG SRC=\"~s\" ALT=\"[~s]\">"
" <A HREF=\"~s\">~-21.s..</A>~*.*c~2.2.0"
"w-~s-~w ~2.2.0w:~2.2.0w~8wk ~s\n",
- [icon(Suffix, MimeType), Suffix, get_href(RequestURI
- ++"/"++InitEntry), Entry, 23-21, 23-21, $ , Day,
+ [icon(Suffix, MimeType), Suffix,
+ RequestURI ++ "/" ++ percent_encode(InitEntry), Entry, 23-21, 23-21, $ , Day,
httpd_util:month(Month),Year,Hour,Minute,
trunc(FileInfo#file_info.size/1024+1),
MimeType]);
@@ -192,8 +192,8 @@ format(Path,RequestURI,ConfigDB,InitEntry) ->
io_lib:format("<IMG SRC=\"~s\" ALT=\"[~s]\"> "
"<A HREF=\"~s\">~s</A>~*.*c~2.2.0w-~s-~w"
" ~2.2.0w:~2.2.0w~8wk ~s\n",
- [icon(Suffix, MimeType), Suffix, get_href(RequestURI
- ++ "/" ++ InitEntry), Entry, 23-EntryLength,
+ [icon(Suffix, MimeType), Suffix,
+ RequestURI ++ "/" ++ percent_encode(InitEntry), Entry, 23-EntryLength,
23-EntryLength, $ ,Day,
httpd_util:month(Month),Year,Hour,Minute,
trunc(FileInfo#file_info.size/1024+1),
@@ -203,11 +203,8 @@ format(Path,RequestURI,ConfigDB,InitEntry) ->
""
end.
-get_href(URI) ->
- percent_encode(URI).
-
percent_encode(URI) when is_list(URI) ->
- Reserved = reserved(),
+ Reserved = reserved(),
lists:append([uri_encode(Char, Reserved) || Char <- URI]);
percent_encode(URI) when is_binary(URI) ->
Reserved = reserved(),
diff --git a/lib/inets/test/httpd_SUITE.erl b/lib/inets/test/httpd_SUITE.erl
index 7c2a2f9075..9f82f09d6e 100644
--- a/lib/inets/test/httpd_SUITE.erl
+++ b/lib/inets/test/httpd_SUITE.erl
@@ -122,7 +122,7 @@ groups() ->
reload_config_file
]},
{post, [], [chunked_post, chunked_chunked_encoded_post, post_204]},
- {basic_auth, [], [basic_auth_1_1, basic_auth_1_0]},
+ {basic_auth, [], [basic_auth_1_1, basic_auth_1_0, verify_href_1_1]},
{auth_api, [], [auth_api_1_1, auth_api_1_0]},
{auth_api_dets, [], [auth_api_1_1, auth_api_1_0]},
{auth_api_mnesia, [], [auth_api_1_1, auth_api_1_0]},
@@ -553,6 +553,24 @@ basic_auth(Config) ->
%% Authentication still required!
basic_auth_requiered(Config).
+verify_href_1_1(Config) when is_list(Config) ->
+ verify_href([{http_version, "HTTP/1.1"} | Config]).
+
+verify_href() ->
+ [{doc, "Test generated hrefs (related to GH-4677), check that hrefs for dir listing work"}].
+
+verify_href(Config) when is_list(Config) ->
+ Version = proplists:get_value(http_version, Config),
+ Host = proplists:get_value(host, Config),
+ Go = fun(Path, User, Password, Opts) ->
+ ct:pal("Navigating to ~p", [Path]),
+ auth_status(auth_request(Path, User, Password, Version, Host),
+ Config, Opts)
+ end,
+ {ok, Hrefs} = Go("/open/", "Aladdin", "AladdinPassword", [{statuscode, 200}, {fetch_hrefs, true}]),
+ [ok = Go(H, "one", "onePassword", [{statuscode, 200}]) || H <- Hrefs],
+ ok.
+
auth_api_1_1(Config) when is_list(Config) ->
auth_api([{http_version, "HTTP/1.1"} | Config]).
diff --git a/lib/inets/test/httpd_test_lib.erl b/lib/inets/test/httpd_test_lib.erl
index 31a9c72e9c..e2578b9d76 100644
--- a/lib/inets/test/httpd_test_lib.erl
+++ b/lib/inets/test/httpd_test_lib.erl
@@ -307,12 +307,27 @@ validate(RequestStr, #state{status_line = {Version, StatusCode, _},
check_body(RequestStr, StatusCode,
Headers#http_response_h.'content-type',
list_to_integer(Headers#http_response_h.'content-length'),
- Body)
+ Body),
+ case proplists:get_bool(fetch_hrefs, Options) of
+ true ->
+ {ok, fetch_hrefs(Body)};
+ _ ->
+ ok
+ end
end.
%--------------------------------------------------------------------
%% Internal functions
%%------------------------------------------------------------------
+fetch_hrefs(Body) ->
+ {match, Matches} = re:run(Body, <<"HREF.*\"">>, [global]),
+ Parse = fun(B, S, L) ->
+ Sliced = string:slice(B, S, L),
+ HrefBin = lists:nth(2, re:split(Sliced, <<"\"">>)),
+ binary:bin_to_list(HrefBin)
+ end,
+ [Parse(Body, Start, Length) || [{Start, Length}] <- Matches].
+
check_version(Version, Options) ->
case lists:keysearch(version, 1, Options) of
{value, {version, Version}} ->