[
https://issues.apache.org/jira/browse/COUCHDB-2748?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14653397#comment-14653397
]
Robert Newson commented on COUCHDB-2748:
----------------------------------------
Ok, so I think we got this. There's no bug.
The confusion is that the doc ids returned in json responses are not
URL-encoded (they don't need to be, so they aren't). The client is obliged to
apply URL encoding to a doc id returned in a json response body iff they put
them into a url.
If I insert;
curl 'foo:bar@localhost:15984/testrainyday/BANANA%253A21%25' -XPUT -d{}
> {"ok":true,"id":"BANANA%3A21%","rev":"1-967a00dff5e02add41819138abb3284d"}
My id is BANANA then an % then 3A21 then a %. That's what I intended, but I had
to URL encode the 2 % characters (and only those two). I do not intend to embed
a : (which is %3A with url encoding).
If I ask _all_docs;
curl 'foo:bar@localhost:15984/testrainyday/_all_docs'
{"total_rows":1,"offset":0,"rows":[
{"id":"BANANA%3A21%","key":"BANANA%3A21%","value":{"rev":"1-967a00dff5e02add41819138abb3284d"}}
]}
It returns my id without URL encoding (since it's a JSON response body, not a
URL)
Here's where the client bug is, if I do;
curl 'foo:bar@localhost:15984/testrainyday/BANANA%3A21%'
{"error":"not_found","reason":"missing"}
Of course it's missing, that's not my id.
If I want to put this id in the url, I have to URL encode it;
curl 'foo:bar@localhost:15984/testrainyday/BANANA%253A21%25'
> {"_id":"BANANA%3A21%","_rev":"1-967a00dff5e02add41819138abb3284d"}
> encoding problems with reserved chars
> -------------------------------------
>
> Key: COUCHDB-2748
> URL: https://issues.apache.org/jira/browse/COUCHDB-2748
> Project: CouchDB
> Issue Type: Bug
> Security Level: public(Regular issues)
> Components: Database Core
> Reporter: Robert Kowalski
>
> Let's create a database!
> {noformat}
> curl -X PUT http://localhost:5984/testrainyday
> {noformat}
> I get: {{{"ok":true}}}
> Let's create a document called BANANA%253A21%25
> {noformat}
> curl -X PUT http://localhost:5984/testrainyday/BANANA%253A21%25 -d '{}'
> {noformat}
> CouchDB returns:
> {noformat}
> {"_id":"BANANA%3A21%","_rev":"1-967a00dff5e02add41819138abb3284d"}
> {noformat}
> (note the changed id - it misses the 25)
> lets use the id from the response to retrieve the doc:
> {noformat}
> curl http://localhost:5984/testrainyday/BANANA%3A21%
> {noformat}
> i get:
> {noformat}
> {"error":"not_found","reason":"missing"}
> {noformat}
> :(
> New try:
> curl http://localhost:5984/testrainyday/_all_docs
> returns:
> {noformat}
> {"total_rows":1,"offset":0,"rows":[
> {"id":"BANANA%3A21%","key":"BANANA%3A21%","value":{"rev":"1-967a00dff5e02add41819138abb3284d"}}
> ]}
> {noformat}
> I get BANANA%3A21% as id again, but when I want to curl it or use in my JS
> application, I get `{"error":"not_found","reason":"missing"}`
> I noticed that it works for these two ids:
> curl -X PUT http://localhost:5984/testrainyday/BANANA%25 -d '{}'
> {noformat}
> {"ok":true,"id":"BANANA%","rev":"1-967a00dff5e02add41819138abb3284d"}
> {noformat}
> In this last case it works magically for both ids:
> {noformat}
> (17:54:11) [robert@tequila-work] ~ $ curl -X PUT
> http://localhost:5984/testrainyday/BANANA%25 -d '{}'
> {"ok":true,"id":"BANANA%","rev":"1-967a00dff5e02add41819138abb3284d"}
> (17:55:45) [robert@tequila-work] ~ $ curl
> http://localhost:5984/testrainyday/BANANA%25
> {"_id":"BANANA%","_rev":"1-967a00dff5e02add41819138abb3284d"}
> (17:55:57) [robert@tequila-work] ~ $ curl
> http://localhost:5984/testrainyday/BANANA%
> {"_id":"BANANA%","_rev":"1-967a00dff5e02add41819138abb3284d"}
> {noformat}
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)