diff options
author | Adam Kocoloski <adam@cloudant.com> | 2014-01-18 00:31:49 -0500 |
---|---|---|
committer | Adam Kocoloski <adam@cloudant.com> | 2014-01-18 00:31:49 -0500 |
commit | 147adec8ef3763cb1821f411f393d6560aaccad2 (patch) | |
tree | d30c32bae4f4ada6d5f161688ab5339720619447 | |
parent | eabece10a40618875e9e43cbc3f9231f80adecb7 (diff) | |
download | couchdb-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.erl | 54 |
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 |