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