[ 
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)

Reply via email to