You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@couchdb.apache.org by be...@apache.org on 2010/09/07 23:07:17 UTC

svn commit: r993532 - in /couchdb/trunk: share/www/script/test/rewrite.js src/couchdb/couch_httpd_rewrite.erl

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).



Re: svn commit: r993532 - in /couchdb/trunk: share/www/script/test/rewrite.js src/couchdb/couch_httpd_rewrite.erl

Posted by Benoit Chesneau <bc...@gmail.com>.
On Mon, Feb 28, 2011 at 11:54 PM, Jan Lehnardt <ja...@apache.org> wrote:
> Hey Benoit,
>
> how do you feel about changing <var> to {var}? It is a bit closer to URL Templating used by other systems. <var> reminds me too much of XML to make me happy :)
>
> If I see it correctly, this code is only in 1.1.x and trunk, so there's still time to work on it.
>
> Cheers
> Jan
> --
>
sound good for me :)

- benoit

Re: svn commit: r993532 - in /couchdb/trunk: share/www/script/test/rewrite.js src/couchdb/couch_httpd_rewrite.erl

Posted by Jan Lehnardt <ja...@apache.org>.
Hey Benoit,

how do you feel about changing <var> to {var}? It is a bit closer to URL Templating used by other systems. <var> reminds me too much of XML to make me happy :)

If I see it correctly, this code is only in 1.1.x and trunk, so there's still time to work on it.

Cheers
Jan
-- 



On 7 Sep 2010, at 23:07, benoitc@apache.org wrote:

> 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).
> 
>