1
# Bugfixes for redirects in replication and iolists in OAuth qs params
2
# Rev at http://svn.apache.org/viewvc?view=revision&revision=825402
5
# http://svn.apache.org/viewvc/couchdb/branches/0.10.x/src/couchdb/couch_rep_httpc.erl?r1=825402&r2=825401&pathrev=825402
6
# http://svn.apache.org/viewvc/couchdb/branches/0.10.x/share/www/script/test/oauth.js?r1=825402&r2=825401&pathrev=825402
8
--- src/couchdb/couch_rep_httpc.erl 2009/10/15 05:46:22 825401
9
+++ src/couchdb/couch_rep_httpc.erl 2009/10/15 05:47:40 825402
11
Code =:= 301; Code =:= 302 ->
12
MochiHeaders = mochiweb_headers:make(Headers),
13
RedirectUrl = mochiweb_headers:get_value("Location", MochiHeaders),
14
- do_request(Req#http_db{url = RedirectUrl});
15
+ do_request(redirected_request(Req, RedirectUrl));
18
Code >= 400, Code < 500 ->
20
do_request(Req#http_db{retries = Retries-1, pause = 2*Pause})
23
+redirected_request(Req, RedirectUrl) ->
24
+ {Base, QStr, _} = mochiweb_util:urlsplit_path(RedirectUrl),
25
+ QS = mochiweb_util:parse_qs(QStr),
26
+ Hdrs = case proplists:get_value(<<"oauth">>, Req#http_db.auth) of
28
+ Req#http_db.headers;
30
+ lists:keydelete("Authorization", 1, Req#http_db.headers)
32
+ Req#http_db{url=Base, resource="", qs=QS, headers=Hdrs}.
34
spawn_worker_process(Req) ->
35
Url = ibrowse_lib:parse_url(Req#http_db.url),
36
{ok, Pid} = ibrowse_http_client:start(Url),
40
oauth_header(Url, QS, Action, Props) ->
41
- QSL = [{couch_util:to_list(K), couch_util:to_list(V)} || {K,V} <- QS],
42
+ % erlang-oauth doesn't like iolists
43
+ QSL = [{couch_util:to_list(K), ?b2l(?l2b(couch_util:to_list(V)))} ||
45
ConsumerKey = ?b2l(proplists:get_value(<<"consumer_key">>, Props)),
46
Token = ?b2l(proplists:get_value(<<"token">>, Props)),
47
TokenSecret = ?b2l(proplists:get_value(<<"token_secret">>, Props)),
48
--- share/www/script/test/oauth.js 2009/10/15 05:46:22 825401
49
+++ share/www/script/test/oauth.js 2009/10/15 05:47:40 825402
51
T(xhr.status == expectedCode);
54
+ var dbA = new CouchDB("test_suite_db_a", {
55
+ "X-Couch-Full-Commit":"false",
56
+ "Authorization": adminBasicAuthHeaderValue()
58
+ T(dbA.save({_id:"_design/"+i+consumerKey}).ok);
59
var result = CouchDB.replicate(dbPair.source, dbPair.target, {
60
headers: {"Authorization": adminBasicAuthHeaderValue()}