From 635b493da67ef88af21174a4110b4d53aa4a813f Mon Sep 17 00:00:00 2001 From: Benoit Chesneau Date: Wed, 4 Aug 2010 20:11:53 +0000 Subject: add wildcard support in query args so it's now possible to have rules like : { "from": "/welcome4/*", "to" : "_show/welcome3", "query": { "name": "*" } } rewriting "_rewrite/welcome4/test" to "_show/welcome3?name=test" or { "from": "/welcome5/*", "to" : "_show/*", } rewriting "_rewrite/welcome5/welcome3" to "_show/welcome3" git-svn-id: https://svn.apache.org/repos/asf/couchdb/trunk@982388 13f79535-47bb-0310-9956-ffa450edef68 --- share/www/script/test/rewrite.js | 25 ++++++++++++++++++++++++- src/couchdb/couch_httpd_rewrite.erl | 31 +++++++++++++++++++------------ 2 files changed, 43 insertions(+), 13 deletions(-) diff --git a/share/www/script/test/rewrite.js b/share/www/script/test/rewrite.js index 66b33d74..56d0c31b 100644 --- a/share/www/script/test/rewrite.js +++ b/share/www/script/test/rewrite.js @@ -83,6 +83,20 @@ couchTests.rewrite = function(debug) { "to": "_show/welcome2/:name", "method": "GET" }, + { + "from": "/welcome4/*", + "to" : "_show/welcome3", + "query": { + "name": "*" + } + }, + { + "from": "/welcome5/*", + "to" : "_show/*", + "query": { + "name": "*" + } + }, { "from": "simpleForm/basicView", "to": "_list/simpleForm/basicView", @@ -169,6 +183,9 @@ couchTests.rewrite = function(debug) { "welcome2": stringFun(function(doc, req) { return "Welcome " + doc.name; }), + "welcome3": stringFun(function(doc,req) { + return "Welcome " + req.query["name"]; + }) }, updates: { "hello" : stringFun(function(doc, req) { @@ -288,6 +305,12 @@ couchTests.rewrite = function(debug) { xhr = CouchDB.request("GET", "/test_suite_db/_design/test/_rewrite/welcome3/test"); T(xhr.responseText == "Welcome test"); + + req = CouchDB.request("GET", "/test_suite_db/_design/test/_rewrite/welcome4/user"); + T(req.responseText == "Welcome user"); + + req = CouchDB.request("GET", "/test_suite_db/_design/test/_rewrite/welcome5/welcome3"); + T(req.responseText == "Welcome welcome3"); // get with query params @@ -368,4 +391,4 @@ couchTests.rewrite = function(debug) { }); -} \ No newline at end of file +} diff --git a/src/couchdb/couch_httpd_rewrite.erl b/src/couchdb/couch_httpd_rewrite.erl index ca4ac1f0..8bf5b70c 100644 --- a/src/couchdb/couch_httpd_rewrite.erl +++ b/src/couchdb/couch_httpd_rewrite.erl @@ -245,6 +245,8 @@ replace_var(Key, Value, Bindings) -> case Value of <<":", Var/binary>> -> get_var(Var, Bindings, Value); + <<"*">> -> + get_var(Value, Bindings, Value); _ when is_list(Value) -> Value1 = lists:foldr(fun(V, Acc) -> V1 = case V of @@ -254,8 +256,9 @@ replace_var(Key, Value, Bindings) -> iolist_to_binary(V2); V2 -> V2 end; + <<"*">> -> + get_var(V, Bindings, V); _ -> - V end, [V1|Acc] @@ -303,7 +306,7 @@ make_new_path([P|Rest], Bindings, Remaining, Acc) -> %% method rule is '*', which is the default, all %% request method will bind. It allows us to make rules %% depending on HTTP method. -bind_method(?MATCH_ALL, _Method) -> +bind_method(?MATCH_ALL, _Method ) -> true; bind_method({bind, Method}, Method) -> true; @@ -315,8 +318,8 @@ bind_method(_, _) -> %% to the current url by pattern matching bind_path([], [], Bindings) -> {ok, [], Bindings}; -bind_path([?MATCH_ALL], Rest, Bindings) when is_list(Rest) -> - {ok, Rest, Bindings}; +bind_path([?MATCH_ALL], [Match|RestMatch]=Rest, Bindings) when is_list(Rest) -> + {ok, Rest, [{?MATCH_ALL, Match}|Bindings]}; bind_path(_, [], _) -> fail; bind_path([{bind, Token}|RestToken],[Match|RestMatch],Bindings) -> @@ -402,15 +405,19 @@ path_to_list([P|R], Acc, DotDotCount) -> end, path_to_list(R, [P1|Acc], DotDotCount). -encode_query(Props) -> +encode_query(Props) -> Props1 = lists:foldl(fun ({{bind, K}, V}, Acc) -> - V1 = case is_list(V) orelse is_binary(V) of - true -> V; - false -> - % probably it's a number - quote_plus(V) - end, - [{K, V1} | Acc] + case K of + <<"*">> -> Acc; + _ -> + V1 = case is_list(V) orelse is_binary(V) of + true -> V; + false -> + % probably it's a number + quote_plus(V) + end, + [{K, V1} | Acc] + end end, [], Props), lists:flatten(mochiweb_util:urlencode(Props1)). -- cgit v1.2.3