diff options
| -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"); | 
