Generate relative URLs in listing_fallback_handler

This commit is contained in:
David Wragg 2011-02-11 11:37:23 +00:00
parent f0450acdfc
commit 5f97135a6e
3 changed files with 51 additions and 5 deletions

View File

@ -85,15 +85,23 @@ listing_fallback_handler(Req) ->
"<head><title>RabbitMQ Web Server</title></head>"
"<body><h1>RabbitMQ Web Server</h1><p>Contexts available:</p><ul>",
HTMLSuffix = "</ul></body></html>",
Contexts = [{"/" ++ P, D} || {P, D} <- gen_server:call(?MODULE, list)],
{ReqPath, _, _} = mochiweb_util:urlsplit_path(Req:get(raw_path)),
Contexts = gen_server:call(?MODULE, list),
List =
case Contexts of
[] ->
"<li>No contexts installed</li>";
_ ->
[io_lib:format("<li><a href=\"~s\">~s</a></li>", [Path, Desc])
|| {Path, Desc} <- Contexts, Desc =/= none] ++
[io_lib:format("<li>~s</li>", [Path])
|| {Path, Desc} <- Contexts, Desc == none]
[handler_listing(Path, ReqPath, Desc)
|| {Path, Desc} <- Contexts]
end,
Req:respond({200, [], HTMLPrefix ++ List ++ HTMLSuffix}).
handler_listing(Path, ReqPath, Desc) ->
handler_listing(rabbit_mochiweb_util:relativise(ReqPath, "/" ++ Path),
Desc).
handler_listing(Path, none) ->
io_lib:format("<li>~s</li>", [Path]);
handler_listing(Path, Desc) ->
io_lib:format("<li><a href=\"~s\">~s</a></li>", [Path, Desc]).

View File

@ -22,6 +22,7 @@
-module(rabbit_mochiweb_util).
-export([parse_auth_header/1]).
-export([relativise/2]).
parse_auth_header(Header) ->
case Header of
@ -35,3 +36,19 @@ parse_auth_header(Header) ->
_ ->
invalid
end.
relativise("/" ++ F, "/" ++ T) ->
From = string:tokens(F, "/"),
To = string:tokens(T, "/"),
string:join(relativise0(From, To), "/").
relativise0([H], [H|_] = To) ->
To;
relativise0([H|From], [H|To]) ->
relativise0(From, To);
relativise0(From, []) ->
lists:duplicate(length(From), "..");
relativise0([_|From], To) ->
lists:duplicate(length(From), "..") ++ To;
relativise0([], To) ->
To.

View File

@ -7,3 +7,24 @@ query_static_resource_test() ->
{ok, _Result} =
http:request("http://localhost:55672/rabbit_mochiweb_test/index.html"),
ok.
relativise_test() ->
?assertEqual("baz",
rabbit_mochiweb_util:relativise("/foo/bar/bash",
"/foo/bar/baz")),
?assertEqual("../bax/baz",
rabbit_mochiweb_util:relativise("/foo/bar/bash",
"/foo/bax/baz")),
?assertEqual("../bax/baz",
rabbit_mochiweb_util:relativise("/bar/bash",
"/bax/baz")),
?assertEqual("..",
rabbit_mochiweb_util:relativise("/foo/bar/bash",
"/foo/bar")),
?assertEqual("../..",
rabbit_mochiweb_util:relativise("/foo/bar/bash",
"/foo")),
?assertEqual("bar/baz",
rabbit_mochiweb_util:relativise("/foo/bar",
"/foo/bar/baz")),
?assertEqual("foo", rabbit_mochiweb_util:relativise("/", "/foo")).