incubator-couchdb-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Bernhard Gschwantner <bernh...@unserwein.at>
Subject Re: Redirects from _list functions in CouchDB 1.4
Date Wed, 18 Sep 2013 13:04:30 GMT
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
  • Unnamed multipart/alternative (inline, None, 0 bytes)
View raw message