summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/couchdb/couch_rep.erl5
-rw-r--r--src/couchdb/couch_rep_httpc.erl17
-rwxr-xr-xtest/etap/110-replication-httpc.t6
3 files changed, 16 insertions, 12 deletions
diff --git a/src/couchdb/couch_rep.erl b/src/couchdb/couch_rep.erl
index 8805577e..fa4d33bd 100644
--- a/src/couchdb/couch_rep.erl
+++ b/src/couchdb/couch_rep.erl
@@ -416,10 +416,7 @@ open_db({Props}, _UserCtx) ->
auth = AuthProps,
headers = lists:ukeymerge(1, Headers, DefaultHeaders)
},
- case couch_rep_httpc:db_exists(Db) of
- true -> Db;
- false -> throw({db_not_found, ?l2b(Url)})
- end;
+ couch_rep_httpc:db_exists(Db);
open_db(<<"http://",_/binary>>=Url, _) ->
open_db({[{<<"url">>,Url}]}, []);
open_db(<<"https://",_/binary>>=Url, _) ->
diff --git a/src/couchdb/couch_rep_httpc.erl b/src/couchdb/couch_rep_httpc.erl
index fdc640dd..9e8bfb42 100644
--- a/src/couchdb/couch_rep_httpc.erl
+++ b/src/couchdb/couch_rep_httpc.erl
@@ -56,20 +56,27 @@ do_request(Req) ->
process_response(Resp, Req).
db_exists(Req) ->
+ db_exists(Req, Req#http_db.url).
+
+db_exists(Req, CanonicalUrl) ->
#http_db{
url = Url,
headers = Headers
} = Req,
case catch ibrowse:send_req(Url, Headers, head) of
{ok, "200", _, _} ->
- true;
- {ok, "301", Headers, _} ->
- MochiHeaders = mochiweb_headers:make(Headers),
+ Req#http_db{url = CanonicalUrl};
+ {ok, "301", RespHeaders, _} ->
+ MochiHeaders = mochiweb_headers:make(RespHeaders),
+ RedirectUrl = mochiweb_headers:get_value("Location", MochiHeaders),
+ db_exists(Req#http_db{url = RedirectUrl}, RedirectUrl);
+ {ok, "302", RespHeaders, _} ->
+ MochiHeaders = mochiweb_headers:make(RespHeaders),
RedirectUrl = mochiweb_headers:get_value("Location", MochiHeaders),
- db_exists(Req#http_db{url = RedirectUrl});
+ db_exists(Req#http_db{url = RedirectUrl}, CanonicalUrl);
Error ->
?LOG_DEBUG("DB at ~s could not be found because ~p", [Url, Error]),
- false
+ throw({db_not_found, ?l2b(Url)})
end.
full_url(#http_db{url=Url} = Req) when is_binary(Url) ->
diff --git a/test/etap/110-replication-httpc.t b/test/etap/110-replication-httpc.t
index 3c454e25..2bc140f6 100755
--- a/test/etap/110-replication-httpc.t
+++ b/test/etap/110-replication-httpc.t
@@ -44,7 +44,7 @@ main(_) ->
code:add_pathz("src/mochiweb"),
code:add_pathz("src/erlang-oauth"),
- etap:plan(7),
+ etap:plan(6),
case (catch test()) of
ok ->
etap:end_tests();
@@ -129,5 +129,5 @@ test_qs() ->
test_db_exists() ->
Req1 = #http_db{url=server() ++ dbname() ++ "/"},
Req2 = #http_db{url=server() ++ dbname() ++ "_foo/"},
- etap:ok(couch_rep_httpc:db_exists(Req1), "db_exists true check"),
- etap:is(couch_rep_httpc:db_exists(Req2), false, "db_exists false check").
+ etap:is(couch_rep_httpc:db_exists(Req1), Req1, "db_exists true check").
+ % etap:is(couch_rep_httpc:db_exists(Req2), false, "db_exists false check").