Browse Source

URL decode query strings

Should be good for both GET and POST query strings.

This adds https://github.com/klaar/quoted.erl as a dependency.
Props to klaar for this code.
Loïc Hoguin 14 years ago
parent
commit
fa20273b37
4 changed files with 13 additions and 4 deletions
  1. 1 0
      .gitignore
  2. 4 1
      Makefile
  3. 4 0
      rebar.config
  4. 4 3
      src/cowboy_http_req.erl

+ 1 - 0
.gitignore

@@ -1,5 +1,6 @@
 .cowboy_dialyzer.plt
 .cowboy_dialyzer.plt
 .eunit
 .eunit
+deps
 doc/*.css
 doc/*.css
 doc/*.html
 doc/*.html
 doc/*.png
 doc/*.png

+ 4 - 1
Makefile

@@ -5,9 +5,12 @@ REBAR = rebar
 
 
 all: app
 all: app
 
 
-app:
+app: deps
 	@$(REBAR) compile
 	@$(REBAR) compile
 
 
+deps:
+	@$(REBAR) get-deps
+
 clean:
 clean:
 	@$(REBAR) clean
 	@$(REBAR) clean
 	rm -f test/*.beam
 	rm -f test/*.beam

+ 4 - 0
rebar.config

@@ -1,4 +1,8 @@
 {cover_enabled, true}.
 {cover_enabled, true}.
+{deps, [
+	{quoted, "1.0.0",
+		{git, "git://github.com/klaar/quoted.erl.git", {tag, "1.0.1"}}}
+]}.
 {erl_opts, [
 {erl_opts, [
 %%	bin_opt_info,
 %%	bin_opt_info,
 %%	warn_missing_spec,
 %%	warn_missing_spec,

+ 4 - 3
src/cowboy_http_req.erl

@@ -282,8 +282,8 @@ parse_qs(<<>>) ->
 parse_qs(Qs) ->
 parse_qs(Qs) ->
 	Tokens = binary:split(Qs, <<"&">>, [global, trim]),
 	Tokens = binary:split(Qs, <<"&">>, [global, trim]),
 	[case binary:split(Token, <<"=">>) of
 	[case binary:split(Token, <<"=">>) of
-		[Token] -> {Token, true};
-		[Name, Value] -> {Name, Value}
+		[Token] -> {quoted:from_url(Token), true};
+		[Name, Value] -> {quoted:from_url(Name), quoted:from_url(Value)}
 	end || Token <- Tokens].
 	end || Token <- Tokens].
 
 
 -spec response_head(http_status(), http_headers(), http_headers()) -> iolist().
 -spec response_head(http_status(), http_headers(), http_headers()) -> iolist().
@@ -427,7 +427,8 @@ parse_qs_test_() ->
 		{<<"a&b">>, [{<<"a">>, true}, {<<"b">>, true}]},
 		{<<"a&b">>, [{<<"a">>, true}, {<<"b">>, true}]},
 		{<<"a=b&c&d=e">>, [{<<"a">>, <<"b">>},
 		{<<"a=b&c&d=e">>, [{<<"a">>, <<"b">>},
 			{<<"c">>, true}, {<<"d">>, <<"e">>}]},
 			{<<"c">>, true}, {<<"d">>, <<"e">>}]},
-		{<<"a=b=c=d=e&f=g">>, [{<<"a">>, <<"b=c=d=e">>}, {<<"f">>, <<"g">>}]}
+		{<<"a=b=c=d=e&f=g">>, [{<<"a">>, <<"b=c=d=e">>}, {<<"f">>, <<"g">>}]},
+		{<<"a+b=c+d">>, [{<<"a b">>, <<"c d">>}]}
 	],
 	],
 	[{Qs, fun() -> R = parse_qs(Qs) end} || {Qs, R} <- Tests].
 	[{Qs, fun() -> R = parse_qs(Qs) end} || {Qs, R} <- Tests].