incubator-couchdb-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Jeremy Wall" <jw...@google.com>
Subject Re: URL-decoding reverse proxy breaks remote replication
Date Wed, 03 Sep 2008 19:26:15 GMT
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
  • Unnamed multipart/alternative (inline, None, 0 bytes)
View raw message