incubator-couchdb-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Damien Katz <dam...@apache.org>
Subject Re: URL-decoding reverse proxy breaks remote replication
Date Wed, 03 Sep 2008 19:13:07 GMT
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