summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRonny Pfannschmidt <Ronny.Pfannschmidt@gmx.de>2012-03-23 20:52:17 +0100
committerJan Lehnardt <jan@apache.org>2012-05-01 14:02:25 +0100
commit56744f2f4b63c396a68e892fcfaec1a84ab95bf2 (patch)
tree6ca458d5fa64dff8119ed5a03919bf6d70a114b1
parent58a9b6f3f4a3ccce87e201de070baf3663823b6a (diff)
downloadcouchdb-56744f2f4b63c396a68e892fcfaec1a84ab95bf2.tar.gz
Backport (master): Do not overwrite X-CouchDB-Requested-Path
Master commit id: 40a4e33. Repeated rewrites would replace the initial value of X-CouchDB-Requested-Path. Fixes: COUCHDB-1442
-rw-r--r--CHANGES5
-rw-r--r--NEWS2
-rw-r--r--share/www/script/test/rewrite.js20
-rw-r--r--src/couchdb/couch_httpd_rewrite.erl7
4 files changed, 31 insertions, 3 deletions
diff --git a/CHANGES b/CHANGES
index 265ff6b57..8524110b0 100644
--- a/CHANGES
+++ b/CHANGES
@@ -6,6 +6,11 @@ Version 1.2.1
This version has not been released yet.
+HTTP Interface:
+
+ * No longer rewrites the X-CouchDB-Requested-Path during recursive
+ calls to the rewriter.
+
Version 1.2.0
-------------
diff --git a/NEWS b/NEWS
index caf2089ed..93346f672 100644
--- a/NEWS
+++ b/NEWS
@@ -12,6 +12,8 @@ Version 1.2.1
This version has not been released yet.
+ * Fix various bugs in the URL rewriter when recursion is involved.
+
Version 1.2.0
-------------
diff --git a/share/www/script/test/rewrite.js b/share/www/script/test/rewrite.js
index 845429221..aaf8b69e9 100644
--- a/share/www/script/test/rewrite.js
+++ b/share/www/script/test/rewrite.js
@@ -437,4 +437,24 @@ couchTests.rewrite = function(debug) {
var res = CouchDB.request("GET", "/test_suite_db/_design/invalid/_rewrite/foo");
TEquals(400, res.status, "should return 400");
+ var ddoc_requested_path = {
+ _id: "_design/requested_path",
+ rewrites:[
+ {"from": "show", "to": "_show/origin/0"},
+ {"from": "show_rewritten", "to": "_rewrite/show"}
+ ],
+ shows: {
+ origin: stringFun(function(doc, req) {
+ return req.headers["x-couchdb-requested-path"];
+ })}
+ };
+
+ db.save(ddoc_requested_path);
+ var url = "/test_suite_db/_design/requested_path/_rewrite/show";
+ var res = CouchDB.request("GET", url);
+ TEquals(url, res.responseText, "should return the original url");
+
+ var url = "/test_suite_db/_design/requested_path/_rewrite/show_rewritten";
+ var res = CouchDB.request("GET", url);
+ TEquals(url, res.responseText, "returned the original url");
}
diff --git a/src/couchdb/couch_httpd_rewrite.erl b/src/couchdb/couch_httpd_rewrite.erl
index c8cab85d7..cb164cd1f 100644
--- a/src/couchdb/couch_httpd_rewrite.erl
+++ b/src/couchdb/couch_httpd_rewrite.erl
@@ -165,9 +165,10 @@ handle_rewrite_req(#httpd{
% normalize final path (fix levels "." and "..")
RawPath1 = ?b2l(iolist_to_binary(normalize_path(RawPath))),
- % in order to do OAuth correctly,
- % we have to save the requested path
- Headers = mochiweb_headers:enter("x-couchdb-requested-path",
+ % In order to do OAuth correctly, we have to save the
+ % requested path. We use default so chained rewriting
+ % wont replace the original header.
+ Headers = mochiweb_headers:default("x-couchdb-requested-path",
MochiReq:get(raw_path),
MochiReq:get(headers)),