couchdb-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Adam Kocoloski <adam.kocolo...@gmail.com>
Subject Re: URL-decoding reverse proxy breaks remote replication
Date Wed, 03 Sep 2008 20:03:32 GMT
Hi Jeremy, I think Apache added a "nocanon" keyword in 2.2.7+ that's  
supposed to pass raw URLs onto the backend.  Have you tried that?  Best,

Adam

On Sep 3, 2008, at 3:26 PM, Jeremy Wall wrote:

> An Apache reverse proxy also breaks with url encodings. So that's at  
> least
> one other proxy that does it.
>
> On Wed, Sep 3, 2008 at 2:13 PM, Damien Katz <damien@apache.org> wrote:
>
>> This is an issue I've been anticipating for a while, which is proxies
>> messing around with the url encoding and causing problems.
>>
>> CouchDB url elements are delimited by slashes, for example "GET
>> db/doc/fileattachment". But any of the elements "db" "doc" or  
>> "attachment"
>> could have slashes in them,  if slashes are url encoded (%20 I  
>> think).  So
>> using the slashes requires that the proxies keep the encoding exactly
>> intact, instead of normalizing encoded urls to slashes.
>>
>> I've discussed this a while ago and was advised that proxies  
>> shouldn't mess
>> with the URL encodings. So too me, my default position is this to  
>> me is a
>> bug in nginx. However, I can be convinced otherwise, if other  
>> proxies or
>> tools tend to do the same thing.
>>
>> -Damien
>>
>>
>> On Sep 3, 2008, at 2:38 PM, Adam Kocoloski wrote:
>>
>> Hi, I installed CouchDB behind nginx the other day and noticed that  
>> remote
>>> replication didn't work.  The problem seems to be that
>>>
>>> a) CouchDB stores the replication history in a local doc with an  
>>> ID formed
>>> from the URL-encoded paths to the source and target DBs,
>>>
>>> b) nginx decodes all %2Fs in the URLs it processes, and
>>>
>>> c) couch_httpd chokes on a GET request for the replication history  
>>> doc
>>> using the decoded URL delivered by nginx.
>>>
>>> My workaround was to encode "/" as "|" in the ID of the replication
>>> history document.  It seemed simpler than doing extra special- 
>>> casing in
>>> couch_httpd to handle decoded "/" characters in replication  
>>> docIDs, and I
>>> didn't see any way to turn off URL decoding in nginx.  Best,
>>>
>>> Adam
>>>
>>> --- a/trunk/src/couchdb/couch_rep.erl
>>> +++ b/trunk/src/couchdb/couch_rep.erl
>>> @@ -28,6 +28,9 @@ url_encode([H|T]) ->
>>>       [H|url_encode(T)];
>>>   H == $_; H == $.; H == $-; H == $: ->
>>>       [H|url_encode(T)];
>>> +    % nginx will decode the %2F which makes couch_httpd blow up
>>> +    H == $/ ->
>>> +        [$||url_encode(T)];
>>>   true ->
>>>       case lists:flatten(io_lib:format("~.16.0B", [H])) of
>>>       [X, Y] ->
>>>
>>>
>>>
>>>
>>


Mime
View raw message