couchdb-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Alexander Shorin <kxe...@gmail.com>
Subject Re: Redirects from _list functions in CouchDB 1.4
Date Wed, 18 Sep 2013 15:28:24 GMT
Hi Bernhard,

Sorry, I'd to check my code instead of post it blindly. And yes this
looks as bug for me.

To fix this you have to return any value from list function like:

function(head, req) {
  start({"code": 301, "headers": {"Location": "http://google.com"}});
  return 'redirecting...';
}

this _any_ value may be also empty string, but not null. return ''; also fixes.

--
,,,^..^,,,


On Wed, Sep 18, 2013 at 5:04 PM, Bernhard Gschwantner
<bernhard@unserwein.at> wrote:
> Hi Alexander,
>
> Thanks a lot for the detailled answer! I completely understand what you're
> saying. I've been following the JIRA issues COUCHDB-430, COUCHDB-514 etc.
> for years, since this redirect topic was one of the first obstacles I ran
> into when starting to use CouchDB.
>
> Nevertheless I still don't get a valid redirect, even with start(). It's a
> bit embarrassing that I can't get a simple _list function right... ;-)
>
>
> I put this design doc into a new database "redirect":
>
>
> {
>    "_id": "_design/redirect",
>     "views": {
>        "all": {
>            "map": "function(doc) {\n\temit(doc._id, null);\n}"
>        }
>    },
>    "lists": {
>        "redirect": "function(head, req) {\n\tstart({\n\t\t\"code\":
> 302,\n\t\t\"headers\": {\n\t\t\t\"Location\": \"http://www.google.com
> \"\n\t\t}\n\t});\n}"
>    }
> }
>
>
> The couchdb output when calling
> http://localhost:5984/redirect/_design/test/_list/redirect/all
>
> {"error":"unknown_error","reason":"undef"}
>
>
> This is the couchdb.log output (level INFO):
>
>
> [error] [<0.20382.0>] Uncaught error in HTTP request: {error,undef}
> [info] [<0.20382.0>] Stacktrace: [{undefined,write_chunk,[[]],[]},
>                                   {couch_httpd,last_chunk,1,
>                                    [{file,
>
>  "/Users/jan/Work/build-couchdb-mac/build-couchdb/git-build/https%3A%2F%
> 2Fgit-wip-us.apache.org
> %2Frepos%2Fasf%2Fcouchdb.git%3A1.4.0/src/couchdb/couch_httpd.erl"},
>                                     {line,692}]},
>                                   {couch_mrview_show,list_cb,2,
>                                    [{file,
>
>  "/Users/jan/Work/build-couchdb-mac/build-couchdb/git-build/https%3A%2F%
> 2Fgit-wip-us.apache.org
> %2Frepos%2Fasf%2Fcouchdb.git%3A1.4.0/src/couch_mrview/src/couch_mrview_show.erl"},
>                                     {line,254}]},
>                                   {couch_mrview,finish_fold,2,
>                                    [{file,
>
>  "/Users/jan/Work/build-couchdb-mac/build-couchdb/git-build/https%3A%2F%
> 2Fgit-wip-us.apache.org
> %2Frepos%2Fasf%2Fcouchdb.git%3A1.4.0/src/couch_mrview/src/couch_mrview.erl"},
>                                     {line,339}]},
>                                   {couch_query_servers,with_ddoc_proc,2,
>                                    [{file,
>
>  "/Users/jan/Work/build-couchdb-mac/build-couchdb/git-build/https%3A%2F%
> 2Fgit-wip-us.apache.org
> %2Frepos%2Fasf%2Fcouchdb.git%3A1.4.0/src/couchdb/couch_query_servers.erl"},
>                                     {line,269}]},
>                                   {couch_httpd,etag_maybe,2,
>                                    [{file,
>
>  "/Users/jan/Work/build-couchdb-mac/build-couchdb/git-build/https%3A%2F%
> 2Fgit-wip-us.apache.org
> %2Frepos%2Fasf%2Fcouchdb.git%3A1.4.0/src/couchdb/couch_httpd.erl"},
>                                     {line,600}]},
>                                   {couch_httpd_db,do_db_req,2,
>                                    [{file,
>
>  "/Users/jan/Work/build-couchdb-mac/build-couchdb/git-build/https%3A%2F%
> 2Fgit-wip-us.apache.org
> %2Frepos%2Fasf%2Fcouchdb.git%3A1.4.0/src/couchdb/couch_httpd_db.erl"},
>                                     {line,234}]},
>                                   {couch_httpd,handle_request_int,5,
>                                    [{file,
>
>  "/Users/jan/Work/build-couchdb-mac/build-couchdb/git-build/https%3A%2F%
> 2Fgit-wip-us.apache.org
> %2Frepos%2Fasf%2Fcouchdb.git%3A1.4.0/src/couchdb/couch_httpd.erl"},
>                                     {line,332}]}]
> [info] [<0.20382.0>] 127.0.0.1 - - GET
> /redirect/_design/redirect/_list/redirect/all 500
> [error] [<0.20382.0>] httpd 500 error response:
>  {"error":"unknown_error","reason":"undef"}
>
>
>
> Is this a bug, or am I still missing something?
>
> Regards,
> Bernhard
>
>
>
> 2013/9/18 Alexander Shorin <kxepal@gmail.com>
>
>> Hi Bernhard,
>>
>> you need to send redirect with start() function call.
>>
>> function(head, req) {
>>   start({"code": 301, "headers": {"Location": "http://google.com"}});
>> }
>>
>> http://docs.couchdb.org/en/1.4.x/query-servers.html
>>
>> Why so? start() function allows to send custom HTTP headers to the
>> client before any response (or with first chunk of it). When you
>> return or send() something before or without start() call, query
>> server implicitly called it with empty object payload which means that
>> CouchDB will send default HTTP status code and headers. Since CouchDB
>> sends response of list functions as chunked transfer, it doesn't
>> buffers all of it to let you change HTTP response status or headers
>> somewhere in the middle - what's why you need to define them in first
>> place and start() function explicitly points on this.
>>
>> For show functions your code will work since they produces only one
>> response object which contains response body and optionally may have
>> HTTP status and headers. With a little adaptation, the same is true
>> for update functions too.
>>
>> --
>> ,,,^..^,,,
>>
>>
>> On Tue, Sep 17, 2013 at 5:34 PM, Bernhard Gschwantner
>> <bernhard@unserwein.at> wrote:
>> > Hello,
>> >
>> > I tried to redirect from a _list function without success. This code
>> throws
>> > a badarg error in CouchDB 1.4.0 (also in 1.2 and 1.3):
>> >
>> > function(head, req) {
>> >   return {
>> >     code : 301,
>> >     headers : {
>> >       Location : 'http://www.google.com'
>> >     }
>> >   };
>> > }
>> >
>> > Is there something I am doing wrong or missing?
>> >
>> > The real-world use case is that we have several aliases to each document
>> in
>> > the db, and all those aliases should be redirected to the real document
>> id.
>> > We use a view to emit the aliases and a list function to redirect all
>> those
>> > aliases to the real url.
>> >
>> > We've been working around the previous issues with modifying headers
>> after
>> > getRow() by redirecting through JavaScript, but want to get rid of this
>> > workaround eventually.
>> >
>> > Regards,
>> > Bernhard
>> >
>> > --
>> >
>> > Bernhard Gschwantner
>> > Unser Wein G&U OG
>> > Kirchengasse 13/7, 1070 Wien
>> >
>> > mobil: +43 (6991) 971 32 96
>> > tel: +43 (1) 971 32 95
>> > e-mail: bernhard@unserwein.at
>> > twitter: @bernharduw <http://twitter.com/bernharduw>
>> > web: www.unserwein.at
>>
>
>
>
> --
>
> Bernhard Gschwantner
> Unser Wein G&U OG
> Kirchengasse 13/7, 1070 Wien
>
> mobil: +43 (6991) 971 32 96
> tel: +43 (1) 971 32 95
> e-mail: bernhard@unserwein.at
> twitter: @bernharduw <http://twitter.com/bernharduw>
> web: www.unserwein.at

Mime
View raw message