diff options
author | Jan Lehnardt <jan@apache.org> | 2010-02-18 20:32:32 +0000 |
---|---|---|
committer | Jan Lehnardt <jan@apache.org> | 2010-02-18 20:32:32 +0000 |
commit | 8089f2843af546922116b008432db88f6f9134f2 (patch) | |
tree | ded9b042fbfdbf5758eea63a85c9b68a0160a113 /src | |
parent | 7372432df4987de2a8eb5b202998a2963499025d (diff) |
remove trailing whitespace
git-svn-id: https://svn.apache.org/repos/asf/couchdb/trunk@911560 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'src')
-rw-r--r-- | src/couchdb/couch_httpd_rewrite.erl | 148 |
1 files changed, 74 insertions, 74 deletions
diff --git a/src/couchdb/couch_httpd_rewrite.erl b/src/couchdb/couch_httpd_rewrite.erl index 72ec9545..dca3c2d9 100644 --- a/src/couchdb/couch_httpd_rewrite.erl +++ b/src/couchdb/couch_httpd_rewrite.erl @@ -23,25 +23,25 @@ -define(MATCH_ALL, '*'). -%% doc The http rewrite handler. All rewriting is done from +%% doc The http rewrite handler. All rewriting is done from %% /dbname/_design/ddocname/_rewrite by default. %% %% each rules should be in rewrites member of the design doc. %% Ex of a complete rule : %% -%% { -%% .... -%% "rewrites": [ -%% { -%% "from": "", -%% "to": "index.html", -%% "method": "GET", -%% "query": {} -%% } -%% ] -%% } +%% { +%% .... +%% "rewrites": [ +%% { +%% "from": "", +%% "to": "index.html", +%% "method": "GET", +%% "query": {} +%% } +%% ] +%% } %% -%% from: is the path rule used to bind current uri to the rule. It +%% from: is the path rule used to bind current uri to the rule. It %% use pattern matching for that. %% %% to: rule to rewrite an url. It can contain variables depending on binding @@ -51,27 +51,27 @@ %% method: method to bind the request method to the rule. by default "*" %% query: query args you want to define they can contain dynamic variable %% by binding the key to the bindings -%% +%% %% %% to and from are path with patterns. pattern can be string starting with ":" or %% "*". ex: %% /somepath/:var/* %% -%% This path is converted in erlang list by splitting "/". Each var are +%% This path is converted in erlang list by splitting "/". Each var are %% converted in atom. "*" is converted to '*' atom. The pattern matching is done -%% by splitting "/" in request url in a list of token. A string pattern will -%% match equal token. The star atom ('*' in single quotes) will match any number -%% of tokens, but may only be present as the last pathtern in a pathspec. If all +%% by splitting "/" in request url in a list of token. A string pattern will +%% match equal token. The star atom ('*' in single quotes) will match any number +%% of tokens, but may only be present as the last pathtern in a pathspec. If all %% tokens are matched and all pathterms are used, then the pathspec matches. It works %% like webmachine. Each identified token will be reused in to rule and in query %% -%% The pattern matching is done by first matching the request method to a rule. by +%% The pattern matching is done by first matching the request method to a rule. by %% default all methods match a rule. (method is equal to "*" by default). Then -%% It will try to match the path to one rule. If no rule match, then a 404 error +%% It will try to match the path to one rule. If no rule match, then a 404 error %% is displayed. -%% +%% %% Once a rule is found we rewrite the request url using the "to" and -%% "query" members. The identified token are matched to the rule and +%% "query" members. The identified token are matched to the rule and %% will replace var. if '*' is found in the rule it will contain the remaining %% part if it exists. %% @@ -83,15 +83,15 @@ %% "to": "/some/"} k = v %% %% {"from": "/a/b", /a/b /some/b?var=b var =:= b -%% "to": "/some/:var"} +%% "to": "/some/:var"} %% -%% {"from": "/a", /a /some +%% {"from": "/a", /a /some %% "to": "/some/*"} %% -%% {"from": "/a/*", /a/b/c /some/b/c +%% {"from": "/a/*", /a/b/c /some/b/c %% "to": "/some/*"} %% -%% {"from": "/a", /a /some +%% {"from": "/a", /a /some %% "to": "/some/*"} %% %% {"from": "/a/:foo/*", /a/b/c /some/b/c?foo=b foo =:= b @@ -99,7 +99,7 @@ %% %% {"from": "/a/:foo", /a/b /some/?k=b&foo=b foo =:= b %% "to": "/some", -%% "query": { +%% "query": { %% "k": ":foo" %% }} %% @@ -113,32 +113,32 @@ handle_rewrite_req(#httpd{ path_parts=[DbName, <<"_design">>, DesignName, _Rewrite|PathParts], method=Method, mochi_req=MochiReq}=Req, _Db, DDoc) -> - + % we are in a design handler DesignId = <<"_design/", DesignName/binary>>, Prefix = <<"/", DbName/binary, "/", DesignId/binary>>, QueryList = couch_httpd:qs(Req), - + #doc{body={Props}} = DDoc, - + % get rules from ddoc case proplists:get_value(<<"rewrites">>, Props) of undefined -> - couch_httpd:send_error(Req, 404, <<"rewrite_error">>, + couch_httpd:send_error(Req, 404, <<"rewrite_error">>, <<"Invalid path.">>); Rules -> % create dispatch list from rules DispatchList = [make_rule(Rule) || {Rule} <- Rules], - + %% get raw path by matching url to a rule. - RawPath = case try_bind_path(DispatchList, Method, PathParts, + RawPath = case try_bind_path(DispatchList, Method, PathParts, QueryList) of no_dispatch_path -> throw(not_found); - {NewPathParts, Bindings} -> + {NewPathParts, Bindings} -> Parts = [mochiweb_util:quote_plus(X) || X <- NewPathParts], - - % build new path, reencode query args, eventually convert + + % build new path, reencode query args, eventually convert % them to json Path = lists:append( string:join(Parts, [?SEPARATOR]), @@ -146,20 +146,20 @@ handle_rewrite_req(#httpd{ [] -> []; _ -> [$?, encode_query(Bindings)] end), - + % if path is relative detect it and rewrite path case mochiweb_util:safe_relative_path(Path) of - undefined -> + undefined -> ?b2l(Prefix) ++ "/" ++ Path; - P1 -> + P1 -> ?b2l(Prefix) ++ "/" ++ P1 end - + end, % normalize final path (fix levels "." and "..") RawPath1 = ?b2l(iolist_to_binary(normalize_path(RawPath))), - + ?LOG_DEBUG("rewrite to ~p ~n", [RawPath1]), % build a new mochiweb request @@ -168,27 +168,27 @@ handle_rewrite_req(#httpd{ RawPath1, MochiReq:get(version), MochiReq:get(headers)), - + % cleanup, It force mochiweb to reparse raw uri. MochiReq1:cleanup(), - + #httpd{ db_url_handlers = DbUrlHandlers, design_url_handlers = DesignUrlHandlers, default_fun = DefaultFun, url_handlers = UrlHandlers } = Req, - - couch_httpd:handle_request(MochiReq1, DefaultFun, + + couch_httpd:handle_request(MochiReq1, DefaultFun, UrlHandlers, DbUrlHandlers, DesignUrlHandlers) end. - + %% @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; + no_dispatch_path; try_bind_path([Dispatch|Rest], Method, PathParts, QueryList) -> [{PathParts1, Method1}, RedirectPath, QueryArgs] = Dispatch, case bind_method(Method1, Method) of @@ -196,12 +196,12 @@ try_bind_path([Dispatch|Rest], Method, PathParts, QueryList) -> case bind_path(PathParts1, PathParts, []) of {ok, Remaining, Bindings} -> Bindings1 = Bindings ++ QueryList, - - % we parse query args from the rule and fill - % it eventually with bindings vars + + % we parse query args from the rule and fill + % it eventually with bindings vars QueryArgs1 = make_query_list(QueryArgs, Bindings1, []), - % remove params in QueryLists1 that are already in + % remove params in QueryLists1 that are already in % QueryArgs1 Bindings2 = lists:foldl(fun({K, V}, Acc) -> K1 = to_atom(K), @@ -213,17 +213,17 @@ try_bind_path([Dispatch|Rest], Method, PathParts, QueryList) -> end, [], Bindings1), FinalBindings = Bindings2 ++ QueryArgs1, - NewPathParts = make_new_path(RedirectPath, FinalBindings, - Remaining, []), - {NewPathParts, FinalBindings}; + NewPathParts = make_new_path(RedirectPath, FinalBindings, + Remaining, []), + {NewPathParts, FinalBindings}; fail -> try_bind_path(Rest, Method, PathParts, QueryList) - end; + end; false -> try_bind_path(Rest, Method, PathParts, QueryList) end. - -%% rewriting dynamically the quey list given as query member in + +%% rewriting dynamically the quey list given as query member in %% rewrites. Each value is replaced by one binding or an argument %% passed in url. make_query_list([], _Bindings, Acc) -> @@ -239,7 +239,7 @@ make_query_list([{Key, Value}|Rest], Bindings, Acc) when is_list(Value) -> make_query_list(Rest, Bindings, [{to_atom(Key), Value1}|Acc]); make_query_list([{Key, Value}|Rest], Bindings, Acc) -> make_query_list(Rest, Bindings, [{to_atom(Key), Value}|Acc]). - + replace_var(Key, Value, Bindings) -> case Value of <<":", Var/binary>> -> @@ -270,16 +270,16 @@ make_new_path([?MATCH_ALL|_Rest], _Bindings, Remaining, Acc) -> Acc1 = lists:reverse(Acc) ++ Remaining, Acc1; make_new_path([P|Rest], Bindings, Remaining, Acc) when is_atom(P) -> - P2 = case proplists:get_value(P, Bindings) of + P2 = case proplists:get_value(P, Bindings) of undefined -> << "undefined">>; P1 -> P1 end, make_new_path(Rest, Bindings, Remaining, [P2|Acc]); make_new_path([P|Rest], Bindings, Remaining, Acc) -> make_new_path(Rest, Bindings, Remaining, [P|Acc]). - -%% @doc If method of the query fith the rule method. If the + +%% @doc If method of the query fith the rule method. If the %% method rule is '*', which is the default, all %% request method will bind. It allows us to make rules %% depending on HTTP method. @@ -288,7 +288,7 @@ bind_method(?MATCH_ALL, _Method) -> bind_method(Method, Method) -> true; bind_method(_, _) -> - false. + false. %% @doc bind path. Using the rule from we try to bind variables given @@ -305,14 +305,14 @@ bind_path([Token|RestToken], [Token|RestMatch], Bindings) -> bind_path(RestToken, RestMatch, Bindings); bind_path(_, _, _) -> fail. - + %% normalize path. normalize_path(Path) -> - "/" ++ string:join(normalize_path1(string:tokens(Path, + "/" ++ string:join(normalize_path1(string:tokens(Path, "/"), []), [?SEPARATOR]). - - + + normalize_path1([], Acc) -> lists:reverse(Acc); normalize_path1([".."|Rest], Acc) -> @@ -327,8 +327,8 @@ normalize_path1(["."|Rest], Acc) -> normalize_path1([Path|Rest], Acc) -> normalize_path1(Rest, [Path|Acc]). - -%% @doc transform json rule in erlang for pattern matching + +%% @doc transform json rule in erlang for pattern matching make_rule(Rule) -> Method = case proplists:get_value(<<"method">>, Rule) of undefined -> '*'; @@ -344,17 +344,17 @@ make_rule(Rule) -> parse_path(From) end, ToParts = case proplists:get_value(<<"to">>, Rule) of - undefined -> + undefined -> throw({error, invalid_rewrite_target}); To -> parse_path(To) end, [{FromParts, Method}, ToParts, QueryArgs]. - + parse_path(Path) -> {ok, SlashRE} = re:compile(<<"\\/">>), path_to_list(re:split(Path, SlashRE), []). - + %% @doc convert a path rule (from or to) to an erlang list %% * and path variable starting by ":" are converted %% in erlang atom. @@ -380,17 +380,17 @@ encode_query(Props) -> V; false -> mochiweb_util:quote_plus(V) - end, + end, [{K, V1} | Acc] end, [], Props), lists:flatten(mochiweb_util:urlencode(Props1)). to_atom(V) when is_atom(V) -> - V; + V; to_atom(V) when is_binary(V) -> to_atom(?b2l(V)); to_atom(V) -> list_to_atom(V). - + to_json(V) -> iolist_to_binary(?JSON_ENCODE(V)). |