couchdb-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Jan Lehnardt <...@apache.org>
Subject Re: svn commit: r993532 - in /couchdb/trunk: share/www/script/test/rewrite.js src/couchdb/couch_httpd_rewrite.erl
Date Mon, 28 Feb 2011 22:54:26 GMT
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).
> 
> 


Mime
View raw message