You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@couchdb.apache.org by ko...@apache.org on 2009/09/02 05:49:06 UTC

svn commit: r810351 - in /couchdb/branches/0.10.x: ./ bin/couchdb.tpl.in etc/default/couchdb src/couchdb/couch_rep_changes_feed.erl src/couchdb/couch_rep_httpc.erl src/ibrowse/ibrowse_http_client.erl

Author: kocolosk
Date: Wed Sep  2 03:49:06 2009
New Revision: 810351

URL: http://svn.apache.org/viewvc?rev=810351&view=rev
Log:
merged SSL replication support (r810350) from trunk

Modified:
    couchdb/branches/0.10.x/   (props changed)
    couchdb/branches/0.10.x/bin/couchdb.tpl.in
    couchdb/branches/0.10.x/etc/default/couchdb   (props changed)
    couchdb/branches/0.10.x/src/couchdb/couch_rep_changes_feed.erl
    couchdb/branches/0.10.x/src/couchdb/couch_rep_httpc.erl
    couchdb/branches/0.10.x/src/ibrowse/ibrowse_http_client.erl

Propchange: couchdb/branches/0.10.x/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Wed Sep  2 03:49:06 2009
@@ -3,4 +3,4 @@
 /couchdb/branches/form:729440-730015
 /couchdb/branches/list-iterator:782292-784593
 /couchdb/branches/tail_header:775760-778477
-/couchdb/trunk:806983,807208-807478,807771,808574,808632,808716,808876,809134
+/couchdb/trunk:806983,807208-807478,807771,808574,808632,808716,808876,809134,810350

Modified: couchdb/branches/0.10.x/bin/couchdb.tpl.in
URL: http://svn.apache.org/viewvc/couchdb/branches/0.10.x/bin/couchdb.tpl.in?rev=810351&r1=810350&r2=810351&view=diff
==============================================================================
--- couchdb/branches/0.10.x/bin/couchdb.tpl.in (original)
+++ couchdb/branches/0.10.x/bin/couchdb.tpl.in Wed Sep  2 03:49:06 2009
@@ -225,6 +225,7 @@
         -eval \"application:load(crypto)\" \
         -eval \"application:load(couch)\" \
         -eval \"crypto:start()\" \
+        -eval \"ssl:start()\" \
         -eval \"ibrowse:start()\" \
         -eval \"couch_server:start([$start_arguments]), receive done -> done end.\" "
     if test "$BACKGROUND" = "true" -a "$RECURSED" = "false"; then

Propchange: couchdb/branches/0.10.x/etc/default/couchdb
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Wed Sep  2 03:49:06 2009
@@ -3,5 +3,5 @@
 /couchdb/branches/form/etc/default/couchdb:729440-730015
 /couchdb/branches/list-iterator/etc/default/couchdb:782292-784593
 /couchdb/branches/tail_header/etc/default/couchdb:775760-778477
-/couchdb/trunk/etc/default/couchdb:806983,807208-807478,807771,808574,808632,808716,808876,809134
+/couchdb/trunk/etc/default/couchdb:806983,807208-807478,807771,808574,808632,808716,808876,809134,810350
 /incubator/couchdb/trunk/etc/default/couchdb:642419-694440

Modified: couchdb/branches/0.10.x/src/couchdb/couch_rep_changes_feed.erl
URL: http://svn.apache.org/viewvc/couchdb/branches/0.10.x/src/couchdb/couch_rep_changes_feed.erl?rev=810351&r1=810350&r2=810351&view=diff
==============================================================================
--- couchdb/branches/0.10.x/src/couchdb/couch_rep_changes_feed.erl (original)
+++ couchdb/branches/0.10.x/src/couchdb/couch_rep_changes_feed.erl Wed Sep  2 03:49:06 2009
@@ -30,7 +30,7 @@
     reqid = nil,
     complete = false,
     count = 0,
-    partial_chunk = nil,
+    partial_chunk = <<>>,
     reply_to = nil,
     rows = queue:new()
 }).
@@ -60,7 +60,7 @@
         conn = Pid,
         options = [{stream_to, {self(), once}}, {response_format, binary}],
         headers = Source#http_db.headers -- [{"Accept-Encoding", "gzip"}]
-    },    
+    },
     {ibrowse_req_id, ReqId} = couch_rep_httpc:request(Req),
 
     receive
@@ -127,8 +127,12 @@
 handle_info({ibrowse_async_headers, Id, Code, Hdrs}, #state{reqid=Id}=State) ->
     handle_headers(list_to_integer(Code), Hdrs, State);
 
-handle_info({ibrowse_async_response, Id, Msg}, #state{reqid=Id} = State) ->
-    handle_response(Msg, State);
+handle_info({ibrowse_async_response, Id, {error,E}}, #state{reqid=Id}=State) ->
+    {stop, {error, E}, State};
+
+handle_info({ibrowse_async_response, Id, Chunk}, #state{reqid=Id}=State) ->
+    Messages = [M || M <- re:split(Chunk, ",?\n", [trim]), M =/= <<>>],
+    handle_messages(Messages, State);
 
 handle_info({ibrowse_async_response_end, Id}, #state{reqid=Id} = State) ->
     handle_feed_completion(State);
@@ -200,60 +204,41 @@
         [Code,Hdrs]),
     {stop, {error, Code}, State}.
 
-handle_response({error, Reason}, State) ->
-    {stop, {error, Reason}, State};
-handle_response(<<"\n">>, State) ->
-    ?LOG_DEBUG("got a heartbeat from the remote server", []),
-    ok = maybe_stream_next(State),
-    {noreply, State};
-handle_response(<<"{\"results\":[\n">>, State) ->
+handle_messages([], State) ->
     ok = maybe_stream_next(State),
     {noreply, State};
-handle_response(<<"\n],\n\"last_seq\":", LastSeqStr/binary>>, State) ->
+handle_messages([<<"{\"results\":[">>|Rest], State) ->
+    handle_messages(Rest, State);
+handle_messages([<<"]">>, <<"\"last_seq\":", LastSeqStr/binary>>], State) ->
     LastSeq = list_to_integer(?b2l(hd(re:split(LastSeqStr, "}")))),
-    {noreply, State#state{last_seq = LastSeq}};
-handle_response(<<"{\"last_seq\":", LastSeqStr/binary>>, State) ->
+    handle_feed_completion(State#state{last_seq = LastSeq});
+handle_messages([<<"{\"last_seq\":", LastSeqStr/binary>>], State) ->
     LastSeq = list_to_integer(?b2l(hd(re:split(LastSeqStr, "}")))),
-    {noreply, State#state{last_seq = LastSeq}};
-handle_response(Chunk, #state{partial_chunk=nil} = State) ->
-    #state{
-        count = Count,
-        rows = Rows
-    } = State,
-    ok = maybe_stream_next(State),
-    try
-        Row = decode_row(Chunk),
-        case State of
-        #state{reply_to=nil} ->
-            {noreply, State#state{count=Count+1, rows = queue:in(Row, Rows)}};
-        #state{count=0, reply_to=From}->
-            gen_server:reply(From, [Row]),
-            {noreply, State#state{reply_to=nil}}
-        end
-    catch
-    throw:{invalid_json, Bad} ->
-        {noreply, State#state{partial_chunk = Bad}}
-    end;
-handle_response(Chunk, State) ->
+    handle_feed_completion(State#state{last_seq = LastSeq});
+handle_messages([Chunk|Rest], State) ->
     #state{
         count = Count,
         partial_chunk = Partial,
         rows = Rows
     } = State,
-    ok = maybe_stream_next(State),
-    try
+    NewState = try
         Row = decode_row(<<Partial/binary, Chunk/binary>>),
-        {noreply, case State of
+        case State of
         #state{reply_to=nil} ->
-            State#state{count=Count+1, partial_chunk=nil, rows=queue:in(Row,Rows)};
+            State#state{
+                count = Count+1,
+                partial_chunk = <<>>,
+                rows=queue:in(Row,Rows)
+            };
         #state{count=0, reply_to=From}->
             gen_server:reply(From, [Row]),
-            State#state{reply_to=nil, partial_chunk=nil}
-        end}
+            State#state{reply_to = nil, partial_chunk = <<>>}
+        end
     catch
     throw:{invalid_json, Bad} ->
-        {noreply, State#state{partial_chunk = Bad}}
-    end.
+        State#state{partial_chunk = Bad}
+    end,
+    handle_messages(Rest, NewState).
 
 handle_feed_completion(#state{reply_to=nil} = State)->
     {noreply, State#state{complete=true}};

Modified: couchdb/branches/0.10.x/src/couchdb/couch_rep_httpc.erl
URL: http://svn.apache.org/viewvc/couchdb/branches/0.10.x/src/couchdb/couch_rep_httpc.erl?rev=810351&r1=810350&r2=810351&view=diff
==============================================================================
--- couchdb/branches/0.10.x/src/couchdb/couch_rep_httpc.erl (original)
+++ couchdb/branches/0.10.x/src/couchdb/couch_rep_httpc.erl Wed Sep  2 03:49:06 2009
@@ -147,12 +147,12 @@
 
 spawn_worker_process(Req) ->
     Url = ibrowse_lib:parse_url(Req#http_db.url),
-    {ok, Pid} = ibrowse:spawn_worker_process(Url#url.host, Url#url.port),
+    {ok, Pid} = ibrowse_http_client:start(Url),
     Pid.
 
 spawn_link_worker_process(Req) ->
     Url = ibrowse_lib:parse_url(Req#http_db.url),
-    {ok, Pid} = ibrowse:spawn_link_worker_process(Url#url.host, Url#url.port),
+    {ok, Pid} = ibrowse_http_client:start_link(Url),
     Pid.
 
 maybe_decompress(Headers, Body) ->

Modified: couchdb/branches/0.10.x/src/ibrowse/ibrowse_http_client.erl
URL: http://svn.apache.org/viewvc/couchdb/branches/0.10.x/src/ibrowse/ibrowse_http_client.erl?rev=810351&r1=810350&r2=810351&view=diff
==============================================================================
--- couchdb/branches/0.10.x/src/ibrowse/ibrowse_http_client.erl (original)
+++ couchdb/branches/0.10.x/src/ibrowse/ibrowse_http_client.erl Wed Sep  2 03:49:06 2009
@@ -113,6 +113,16 @@
 		   port = Port},
     put(ibrowse_trace_token, [Host, $:, integer_to_list(Port)]),
     put(my_trace_flag, ibrowse_lib:get_trace_status(Host, Port)),
+    {ok, State};
+init(#url{host=Host, port=Port, protocol=Protocol}) ->
+    State = #state{
+        host = Host,
+        port = Port,
+        is_ssl = (Protocol == https),
+        ssl_options = [{ssl_imp, new}]
+    },
+    put(ibrowse_trace_token, [Host, $:, integer_to_list(Port)]),
+    put(my_trace_flag, ibrowse_lib:get_trace_status(Host, Port)),
     {ok, State}.
 
 %%--------------------------------------------------------------------
@@ -137,7 +147,7 @@
 handle_call(stop, _From, State) ->
     do_close(State),
     do_error_reply(State, closing_on_request),
-    {stop, normal, ok, State};
+    {stop, normal, ok, State#state{socket=undefined}};
 
 handle_call(Request, _From, State) ->
     Reply = {unknown_request, Request},