Browse Source

URL decode paths

This fixes issue #33.
Loïc Hoguin 13 years ago
parent
commit
503a0c7662
1 changed files with 7 additions and 3 deletions
  1. 7 3
      src/cowboy_dispatcher.erl

+ 7 - 3
src/cowboy_dispatcher.erl

@@ -56,10 +56,11 @@ split_path(Path) ->
 
 -spec do_split_path(binary(), <<_:8>>) -> path_tokens().
 do_split_path(RawPath, Separator) ->
-	case binary:split(RawPath, Separator, [global, trim]) of
+	EncodedPath = case binary:split(RawPath, Separator, [global, trim]) of
 		[<<>>|Path] -> Path;
 		Path -> Path
-	end.
+	end,
+	[quoted:from_url(Token) || Token <- EncodedPath].
 
 %% @doc Match hostname tokens and path tokens against dispatch rules.
 %%
@@ -214,7 +215,10 @@ split_path_test_() ->
 		{<<"/users?a">>, [<<"users">>], <<"/users">>, <<"a">>},
 		{<<"/users/42/friends?a=b&c=d&e=notsure?whatever">>,
 			[<<"users">>, <<"42">>, <<"friends">>],
-			<<"/users/42/friends">>, <<"a=b&c=d&e=notsure?whatever">>}
+			<<"/users/42/friends">>, <<"a=b&c=d&e=notsure?whatever">>},
+		{<<"/users/a+b/c%21d?e+f=g+h">>,
+			[<<"users">>, <<"a b">>, <<"c!d">>],
+			<<"/users/a+b/c%21d">>, <<"e+f=g+h">>}
 	],
 	[{P, fun() -> {R, RawP, Qs} = split_path(P) end}
 		|| {P, R, RawP, Qs} <- Tests].