You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@couchdb.apache.org by gi...@git.apache.org on 2017/06/21 17:05:54 UTC
[GitHub] natevw opened a new issue #607: Extra 500 reply added to list function response when accessed through rewrite
natevw opened a new issue #607: Extra 500 reply added to list function response when accessed through rewrite
URL: https://github.com/apache/couchdb/issues/607
I am getting strange responses from CouchDB 2.0.0 when accessing a list handler through a
rewrite. The result to my single request is two responses: the expected one, plus an extra
"unknown_error" 500 response. Over HTTP/1.1 this issue is masked because the extra response
is not properly chunked, but over HTTP/1.0 the two responses appear as a single body before
the connection is closed. So in local development the problem isn't seen in the browser, but
when hosted behind an HTTP/1.0 proxy like nginx in production all clients will see the extra
content appended to the intended HTML.
Regardless of the HTTP version of the request, the behavior is accompanied in the console
logs by:
[error] 2017-06-20T20:54:43.637726Z couchdb@localhost <0.23057.8> 4d6c7d7e8f req_err(2053811356)
unknown_error : undef
[<<"lacc:get/2">>,<<"chttpd:split_response/1 L343">>,<<"chttpd:handle_request_int/1
L234">>,<<"chttpd:process_request/1 L293">>,<<"chttpd:handle_request_int/1
L229">>,<<"mochiweb_http:headers/6 L122">>,<<"proc_lib:init_p_do_apply/3
L247">>]
[notice] 2017-06-20T20:54:43.637979Z couchdb@localhost <0.23057.8> 4d6c7d7e8f undefined
127.0.0.1 undefined GET /test/_design/glob/_rewrite/2015/04/f1040_spreadsheet 500 ok 22
## Expected Behavior
CouchDB should never generate two responses from one request, regardless whether a list function is accessed via a rewrite or whether or not the list calls`getRow()` a sufficient number of times.
## Current Behavior
the list function can be as simple as
function() {
return "[LIST FN OUTPUT]";
}
And the rewrite used looks like
"rewrites": [{
"from": "/:path1/:path2/:path3",
"to": "_list/posts/by_path",
"query": {
"include_docs": "true",
"key": [":path1",":path2",":path3"]
}
}]
When I query this such that "key" ends up matching a row from a simple "by_path" view, I get
an extra garbage response when I access the rewrite:
$ telnet localhost 5984
GET /test/_design/glob/_rewrite/2015/04/f1040_spreadsheet
HTTP/1.1 200 OK
Connection: close
Content-Type: application/json
Date: Tue, 20 Jun 2017 20:34:49 GMT
Server: CouchDB/2.0.0 (Erlang OTP/19)
[LIST FN OUTPUT]HTTP/1.1 500 Internal Server Error
Cache-Control: must-revalidate
Connection: close
Content-Length: 60
Content-Type: application/json
Date: Tue, 20 Jun 2017 20:34:49 GMT
Server: CouchDB/2.0.0 (Erlang OTP/19)
X-Couch-Request-ID: 5e0e7f467b
X-Couch-Stack-Hash: 2053811356
X-CouchDB-Body-Time: 0
{"error":"unknown_error","reason":"undef","ref":2053811356}
Connection closed by foreign host.
## Possible Solution
This does not happen with a direct request to the list, bypassing the rewrite:
GET /test/_design/glob/_list/posts/by_path?include_docs=true&key=["2015","04","f1040_spreadsheet"]
HTTP/1.1 200 OK
Connection: close
Content-Type: application/json
Date: Tue, 20 Jun 2017 20:38:08 GMT
Server: CouchDB/2.0.0 (Erlang OTP/19)
[LIST FN OUTPUT]Connection closed by foreign host.
Nor does it happen if I make a request through the rewrite targeting a "missing key", i.e.
one that was not emitted by the view:
GET /test/_design/glob/_rewrite/2020/13/not_exist
HTTP/1.1 200 OK
Connection: close
Content-Type: application/json
Date: Tue, 20 Jun 2017 20:40:29 GMT
Server: CouchDB/2.0.0 (Erlang OTP/19)
[LIST FN OUTPUT]Connection closed by foreign host.
If I change my list function to
function() {
getRow();
getRow();
return "[LIST FN OUTPUT]";
}
then the problem goes away even when accessed via the rewrite. With just a single call to
`getRow()` the extra response persists.
Also note that the chunked responses of HTTP/1.1 mask this "double response" issue, so you'll
see it in telnet or if CouchDB is behind nginx, but not in a browser or similar:
GET /test/_design/glob/_rewrite/2015/04/f1040_spreadsheet HTTP/1.1
HTTP/1.1 200 OK
Content-Type: application/json
Date: Tue, 20 Jun 2017 20:50:12 GMT
Server: CouchDB/2.0.0 (Erlang OTP/19)
Transfer-Encoding: chunked
d
[LIST FN OUTPUT]
0
HTTP/1.1 500 Internal Server Error
Cache-Control: must-revalidate
Content-Length: 60
Content-Type: application/json
Date: Tue, 20 Jun 2017 20:50:12 GMT
Server: CouchDB/2.0.0 (Erlang OTP/19)
X-Couch-Request-ID: 524b67d8db
X-Couch-Stack-Hash: 2053811356
X-CouchDB-Body-Time: 0
{"error":"unknown_error","reason":"undef","ref":2053811356}
## Steps to Reproduce (for bugs)
The original full code I have is at https://github.com/natevw/glob, but basically:
1. Create a view that returns a result for a particular key
2. Create a list that does not call `getRow()` (or calls it only once)
3. Create a rewrite to the list function
4. Request the list via the rewrite, using the key which has a row
## Context
This resulted in garbage appended to every single post when my blog was hosted behind nginx. I worked around by adding an extra `getRow()` call to my list function: https://github.com/natevw/Glob/commit/53293bd9bd5a91aac49ed2a19339828e455d2951
## Your Environment
* Version used: CouchDB 2.0.0
* Browser Name and version: n/a
* Link to your project: <https://github.com/natevw/glob>
----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on GitHub and use the
URL above to go to the specific comment.
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
With regards,
Apache Git Services