summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorFilipe David Borba Manana <fdmanana@apache.org>2010-07-27 22:06:09 +0000
committerFilipe David Borba Manana <fdmanana@apache.org>2010-07-27 22:06:09 +0000
commit41b1124cde06357c4b9e73fbb50a162d991be340 (patch)
treea47718bd47403b27ff6c851a51eb3537c9eb463c /src
parent1a4a80993f5e18a3bea485246757148daef5f476 (diff)
Merge revision 979887 from trunk:
Fix issues with the replicator when using HTTP Basic authentication, receiving an HTTP redirect response, and loosing the authentication credentials because they're not found in the Location header's URL. This happens for example when the replicator does a request to the URI /somedb/_design%2Fmyddoc git-svn-id: https://svn.apache.org/repos/asf/couchdb/branches/1.0.x@979888 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'src')
-rw-r--r--src/couchdb/couch_rep_httpc.erl23
1 files changed, 17 insertions, 6 deletions
diff --git a/src/couchdb/couch_rep_httpc.erl b/src/couchdb/couch_rep_httpc.erl
index 53e318d3..768d88a3 100644
--- a/src/couchdb/couch_rep_httpc.erl
+++ b/src/couchdb/couch_rep_httpc.erl
@@ -91,18 +91,30 @@ db_exists(Req, CanonicalUrl, CreateDB) ->
{ok, "200", _, _} ->
Req#http_db{url = CanonicalUrl};
{ok, "301", RespHeaders, _} ->
- MochiHeaders = mochiweb_headers:make(RespHeaders),
- RedirectUrl = mochiweb_headers:get_value("Location", MochiHeaders),
+ RedirectUrl = redirect_url(RespHeaders, Req#http_db.url),
db_exists(Req#http_db{url = RedirectUrl}, RedirectUrl);
{ok, "302", RespHeaders, _} ->
- MochiHeaders = mochiweb_headers:make(RespHeaders),
- RedirectUrl = mochiweb_headers:get_value("Location", MochiHeaders),
+ RedirectUrl = redirect_url(RespHeaders, Req#http_db.url),
db_exists(Req#http_db{url = RedirectUrl}, CanonicalUrl);
Error ->
?LOG_DEBUG("DB at ~s could not be found because ~p", [Url, Error]),
throw({db_not_found, ?l2b(Url)})
end.
+redirect_url(RespHeaders, OrigUrl) ->
+ MochiHeaders = mochiweb_headers:make(RespHeaders),
+ RedUrl = mochiweb_headers:get_value("Location", MochiHeaders),
+ {url, _, Base, Port, _, _, Path, Proto} = ibrowse_lib:parse_url(RedUrl),
+ {url, _, _, _, User, Passwd, _, _} = ibrowse_lib:parse_url(OrigUrl),
+ Creds = case is_list(User) andalso is_list(Passwd) of
+ true ->
+ User ++ ":" ++ Passwd ++ "@";
+ false ->
+ []
+ end,
+ atom_to_list(Proto) ++ "://" ++ Creds ++ Base ++ ":" ++
+ integer_to_list(Port) ++ Path.
+
full_url(#http_db{url=Url} = Req) when is_binary(Url) ->
full_url(Req#http_db{url = ?b2l(Url)});
@@ -124,8 +136,7 @@ process_response({ok, Status, Headers, Body}, Req) ->
if Code =:= 200; Code =:= 201 ->
?JSON_DECODE(maybe_decompress(Headers, Body));
Code =:= 301; Code =:= 302 ->
- MochiHeaders = mochiweb_headers:make(Headers),
- RedirectUrl = mochiweb_headers:get_value("Location", MochiHeaders),
+ RedirectUrl = redirect_url(Headers, Req#http_db.url),
do_request(redirected_request(Req, RedirectUrl));
Code =:= 409 ->
throw(conflict);