From 69e03ccc8e6e39750943e298d633acb4650e56b7 Mon Sep 17 00:00:00 2001 From: Adam Kocoloski Date: Fri, 28 Aug 2009 13:05:48 +0000 Subject: fix pattern matching bug in redirects for replication if opening the DB returns 301, use the new URL for the rest of the replication git-svn-id: https://svn.apache.org/repos/asf/couchdb/trunk@808876 13f79535-47bb-0310-9956-ffa450edef68 --- src/couchdb/couch_rep.erl | 5 +---- src/couchdb/couch_rep_httpc.erl | 17 ++++++++++++----- test/etap/110-replication-httpc.t | 6 +++--- 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"). -- cgit v1.2.3