diff options
author | Jan Lehnardt <jan@apache.org> | 2011-09-08 11:03:20 +0000 |
---|---|---|
committer | Jan Lehnardt <jan@apache.org> | 2011-09-08 11:03:20 +0000 |
commit | 860be768c957b0f6954921cd25a9b8465da8617b (patch) | |
tree | ebbd8c7e56ded6179a42d7d35385b857231845bc | |
parent | 6cf2f036ece28c95988b8312c8532fac55a3c7a0 (diff) |
Fix list-style send() API in show functions when using provides()
Also fix ignoring the return value when the send() API isnused.
Patch by Alexander Shorin.
Closes COUCHDB-1272
git-svn-id: https://svn.apache.org/repos/asf/couchdb/branches/1.1.x@1166625 13f79535-47bb-0310-9956-ffa450edef68
-rw-r--r-- | THANKS | 2 | ||||
-rw-r--r-- | share/server/render.js | 10 | ||||
-rw-r--r-- | share/www/script/test/show_documents.js | 26 |
3 files changed, 34 insertions, 4 deletions
@@ -80,6 +80,6 @@ suggesting improvements or submitting changes. Some of these people are: * Sam Bisbee <sam@sbisbee.com> * Nathan Vander Wilt <natevw@yahoo.com> * Caolan McMahon <caolan.mcmahon@googlemail.com> - + * Alexander Shorin <kxepal@gmail.com> For a list of authors see the `AUTHORS` file. diff --git a/share/server/render.js b/share/server/render.js index d207db41..93ff6332 100644 --- a/share/server/render.js +++ b/share/server/render.js @@ -220,10 +220,10 @@ var Render = (function() { resetList(); Mime.resetProvides(); var resp = fun.apply(ddoc, args) || {}; + resp = maybeWrapResponse(resp); // handle list() style API if (chunks.length && chunks.length > 0) { - resp = maybeWrapResponse(resp); resp.headers = resp.headers || {}; for(var header in startResp) { resp.headers[header] = startResp[header] @@ -233,8 +233,12 @@ var Render = (function() { } if (Mime.providesUsed) { - resp = Mime.runProvides(args[1], ddoc); - resp = applyContentType(maybeWrapResponse(resp), Mime.responseContentType); + var provided_resp = Mime.runProvides(args[1], ddoc) || {}; + provided_resp = maybeWrapResponse(provided_resp); + resp.body = (resp.body || "") + chunks.join(""); + resp.body += provided_resp.body || ""; + resp = applyContentType(resp, Mime.responseContentType); + resetList(); } var type = typeOf(resp); diff --git a/share/www/script/test/show_documents.js b/share/www/script/test/show_documents.js index 55ed9698..cf73ed57 100644 --- a/share/www/script/test/show_documents.js +++ b/share/www/script/test/show_documents.js @@ -90,6 +90,24 @@ couchTests.show_documents = function(debug) { start({"X-Couch-Test-Header": "Yeah"}); send("Hey"); }), + "list-api-provides" : stringFun(function(doc, req) { + provides("text", function(){ + send("foo, "); + send("bar, "); + send("baz!"); + }) + }), + "list-api-provides-and-return" : stringFun(function(doc, req) { + provides("text", function(){ + send("4, "); + send("5, "); + send("6, "); + return "7!"; + }) + send("1, "); + send("2, "); + return "3, "; + }), "list-api-mix" : stringFun(function(doc, req) { start({"X-Couch-Test-Header": "Yeah"}); send("Hey "); @@ -395,6 +413,14 @@ couchTests.show_documents = function(debug) { T(xhr.responseText == "Hey"); TEquals("Yeah", xhr.getResponseHeader("X-Couch-Test-Header"), "header should be cool"); + // test list() compatible API with provides function + xhr = CouchDB.request("GET", "/test_suite_db/_design/template/_show/list-api-provides/foo?format=text"); + TEquals(xhr.responseText, "foo, bar, baz!", "should join chunks to response body"); + + // should keep next result order: chunks + return value + provided chunks + provided return value + xhr = CouchDB.request("GET", "/test_suite_db/_design/template/_show/list-api-provides-and-return/foo?format=text"); + TEquals(xhr.responseText, "1, 2, 3, 4, 5, 6, 7!", "should not break 1..7 range"); + xhr = CouchDB.request("GET", "/test_suite_db/_design/template/_show/list-api-mix/foo"); T(xhr.responseText == "Hey Dude"); TEquals("Yeah", xhr.getResponseHeader("X-Couch-Test-Header"), "header should be cool"); |