summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdam Kocoloski <adam@cloudant.com>2014-01-18 00:31:49 -0500
committerAdam Kocoloski <adam@cloudant.com>2014-01-18 00:31:49 -0500
commit147adec8ef3763cb1821f411f393d6560aaccad2 (patch)
treed30c32bae4f4ada6d5f161688ab5339720619447
parenteabece10a40618875e9e43cbc3f9231f80adecb7 (diff)
downloadcouchdb-147adec8ef3763cb1821f411f393d6560aaccad2.tar.gz
Move addition of qs params after normalization
This refactor executes normalize_path/1 before appending the bound query string parameters. COUCHDB-2031
-rw-r--r--src/couchdb/couch_httpd_rewrite.erl54
1 files changed, 25 insertions, 29 deletions
diff --git a/src/couchdb/couch_httpd_rewrite.erl b/src/couchdb/couch_httpd_rewrite.erl
index 1187397f8..4354215f0 100644
--- a/src/couchdb/couch_httpd_rewrite.erl
+++ b/src/couchdb/couch_httpd_rewrite.erl
@@ -143,36 +143,32 @@ handle_rewrite_req(#httpd{
DispatchList = [make_rule(Rule) || {Rule} <- Rules],
Method1 = couch_util:to_binary(Method),
- %% get raw path by matching url to a rule.
- RawPath = case try_bind_path(DispatchList, Method1,
- PathParts, QueryList) of
- no_dispatch_path ->
- throw(not_found);
- {NewPathParts, Bindings} ->
- Parts = [quote_plus(X) || X <- NewPathParts],
-
- % build new path, reencode query args, eventually convert
- % them to json
- Bindings1 = maybe_encode_bindings(Bindings),
- Path = binary_to_list(
- iolist_to_binary([
- string:join(Parts, [?SEPARATOR]),
- [["?", mochiweb_util:urlencode(Bindings1)]
- || Bindings1 =/= [] ]
- ])),
-
- % if path is relative detect it and rewrite path
- case mochiweb_util:safe_relative_path(Path) of
- undefined ->
- ?b2l(Prefix) ++ "/" ++ Path;
- P1 ->
- ?b2l(Prefix) ++ "/" ++ P1
- end
+ % get raw path by matching url to a rule. Throws not_found.
+ {NewPathParts0, Bindings0} =
+ try_bind_path(DispatchList, Method1, PathParts, QueryList),
+ NewPathParts = [quote_plus(X) || X <- NewPathParts0],
+ Bindings = maybe_encode_bindings(Bindings0),
+
+ Path0 = string:join(NewPathParts, [?SEPARATOR]),
+
+ % if path is relative detect it and rewrite path
+ Path1 = case mochiweb_util:safe_relative_path(Path0) of
+ undefined ->
+ ?b2l(Prefix) ++ "/" ++ Path0;
+ P1 ->
+ ?b2l(Prefix) ++ "/" ++ P1
+ end,
+
+ Path2 = normalize_path(Path1),
- end,
+ Path3 = case Bindings of
+ [] ->
+ Path2;
+ _ ->
+ [Path2, "?", mochiweb_util:urlencode(Bindings)]
+ end,
- % normalize final path (fix levels "." and "..")
- RawPath1 = ?b2l(iolist_to_binary(normalize_path(RawPath))),
+ RawPath1 = ?b2l(iolist_to_binary(Path3)),
% In order to do OAuth correctly, we have to save the
% requested path. We use default so chained rewriting
@@ -216,7 +212,7 @@ quote_plus(X) ->
%% @doc Try to find a rule matching current url. If none is found
%% 404 error not_found is raised
try_bind_path([], _Method, _PathParts, _QueryList) ->
- no_dispatch_path;
+ throw(not_found);
try_bind_path([Dispatch|Rest], Method, PathParts, QueryList) ->
[{PathParts1, Method1}, RedirectPath, QueryArgs, Formats] = Dispatch,
case bind_method(Method1, Method) of