couchdb-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From beno...@apache.org
Subject svn commit: r993532 - in /couchdb/trunk: share/www/script/test/rewrite.js src/couchdb/couch_httpd_rewrite.erl
Date Tue, 07 Sep 2010 21:07:17 GMT
Author: benoitc
Date: Tue Sep  7 21:07:17 2010
New Revision: 993532

URL: http://svn.apache.org/viewvc?rev=993532&view=rev
Log:
improve rewriter. No< it's possible to pass a variable in path as <var>
so you can do /somepath/<var>something or /somepath/<var>.txt ...

Modified:
    couchdb/trunk/share/www/script/test/rewrite.js
    couchdb/trunk/src/couchdb/couch_httpd_rewrite.erl

Modified: couchdb/trunk/share/www/script/test/rewrite.js
URL: http://svn.apache.org/viewvc/couchdb/trunk/share/www/script/test/rewrite.js?rev=993532&r1=993531&r2=993532&view=diff
==============================================================================
--- couchdb/trunk/share/www/script/test/rewrite.js (original)
+++ couchdb/trunk/share/www/script/test/rewrite.js Tue Sep  7 21:07:17 2010
@@ -91,6 +91,27 @@ couchTests.rewrite = function(debug) {
              }
             },
             {
+             "from": "/type/<type>.json",
+             "to": "_show/type/:type",
+             "query": {
+                 "format": "json"
+             }
+            },
+            {
+             "from": "/type/<type>.xml",
+             "to": "_show/type/:type",
+             "query": {
+                 "format": "xml"
+             }
+            },
+            {
+             "from": "/type/<type>",
+             "to": "_show/type/:type",
+             "query": {
+                 "format": "html"
+             }
+            },
+            {
              "from": "/welcome5/*",
              "to" : "_show/*",
              "query": {
@@ -193,6 +214,9 @@ couchTests.rewrite = function(debug) {
             }),
             "welcome3": stringFun(function(doc,req) {
               return "Welcome " + req.query["name"];
+            }),
+            "type": stringFun(function(doc, req) {
+                return req.id + " as " + req.query.format;
             })
           },
           updates: {
@@ -380,6 +404,15 @@ couchTests.rewrite = function(debug) {
         xhr = CouchDB.request("GET", "/test_suite_db/_design/test/_rewrite/simpleForm/complexView6?a=test&b=essai");
         T(xhr.status == 200, "with query params");
         T(/Value: doc 4/.test(xhr.responseText));
+
+        req = CouchDB.request("GET", "/test_suite_db/_design/test/_rewrite/type/test.json");
+        T(req.responseText == "test as json");
+
+        req = CouchDB.request("GET", "/test_suite_db/_design/test/_rewrite/type/test.xml");
+        T(req.responseText == "test as xml");
+
+         req = CouchDB.request("GET", "/test_suite_db/_design/test/_rewrite/type/test");
+        T(req.responseText == "test as html");
         
         // test path relative to server
         designDoc.rewrites.push({

Modified: couchdb/trunk/src/couchdb/couch_httpd_rewrite.erl
URL: http://svn.apache.org/viewvc/couchdb/trunk/src/couchdb/couch_httpd_rewrite.erl?rev=993532&r1=993531&r2=993532&view=diff
==============================================================================
--- couchdb/trunk/src/couchdb/couch_httpd_rewrite.erl (original)
+++ couchdb/trunk/src/couchdb/couch_httpd_rewrite.erl Tue Sep  7 21:07:17 2010
@@ -106,6 +106,15 @@
 %% {"from": "/a",           /a?foo=b        /some/b             foo =:= b
 %% "to": "/some/:foo",
 %%  }}
+%% 
+%% {"from": "/a/<foo>"      /a/b            /some/b             foo =:= b
+%% "to": "/a/b",
+%% }}
+%%
+%% {"from": "/a/<foo>.blah"      /a/b            /some/b        foo =:= b
+%% "to": "/a/b",
+%% }}
+
 
 
 
@@ -322,6 +331,14 @@ bind_path([?MATCH_ALL], [Match|_RestMatc
     {ok, Rest, [{?MATCH_ALL, Match}|Bindings]};
 bind_path(_, [], _) ->
     fail;
+bind_path([{bind, {Token, MatchRe}}|RestToken],
+        [Match|RestMatch],Bindings) ->
+    case re:run(Match, MatchRe, [{capture, all, binary}]) of
+        {match, [_, Match1]} ->
+            bind_path(RestToken, RestMatch, [{{bind, Token}, Match1}|Bindings]);
+        _ ->
+            fail 
+    end;
 bind_path([{bind, Token}|RestToken],[Match|RestMatch],Bindings) ->
     bind_path(RestToken, RestMatch, [{{bind, Token}, Match}|Bindings]);
 bind_path([Token|RestToken], [Token|RestMatch], Bindings) ->
@@ -399,8 +416,18 @@ path_to_list([<<"..">>|R], Acc, DotDotCo
     path_to_list(R, [<<"..">>|Acc], DotDotCount+1);
 path_to_list([P|R], Acc, DotDotCount) ->
     P1 = case P of
+        <<"<", _Rest/binary>> ->
+            {ok, VarRe} = re:compile(<<"<([^>].*)>(.*)">>),
+            case re:run(P, VarRe, [{capture, all, binary}]) of
+                {match, [_, Var, Match]} ->
+                    {ok, MatchRe} = re:compile(<<"(.*)", Match/binary>>),
+                    {bind, {Var, MatchRe}};
+                _ -> P
+            end;
         <<":", Var/binary>> ->
             to_binding(Var);
+
+
         _ -> P
     end,
     path_to_list(R, [P1|Acc], DotDotCount).



Mime
View raw message