Return-Path: Delivered-To: apmail-couchdb-commits-archive@www.apache.org Received: (qmail 53497 invoked from network); 19 Nov 2009 21:07:30 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (140.211.11.3) by minotaur.apache.org with SMTP; 19 Nov 2009 21:07:30 -0000 Received: (qmail 18596 invoked by uid 500); 19 Nov 2009 21:07:30 -0000 Delivered-To: apmail-couchdb-commits-archive@couchdb.apache.org Received: (qmail 18498 invoked by uid 500); 19 Nov 2009 21:07:29 -0000 Mailing-List: contact commits-help@couchdb.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@couchdb.apache.org Delivered-To: mailing list commits@couchdb.apache.org Received: (qmail 18487 invoked by uid 99); 19 Nov 2009 21:07:29 -0000 Received: from athena.apache.org (HELO athena.apache.org) (140.211.11.136) by apache.org (qpsmtpd/0.29) with ESMTP; Thu, 19 Nov 2009 21:07:29 +0000 X-ASF-Spam-Status: No, hits=-2.6 required=5.0 tests=AWL,BAYES_00 X-Spam-Check-By: apache.org Received: from [140.211.11.4] (HELO eris.apache.org) (140.211.11.4) by apache.org (qpsmtpd/0.29) with ESMTP; Thu, 19 Nov 2009 21:07:26 +0000 Received: by eris.apache.org (Postfix, from userid 65534) id E6F4A2388996; Thu, 19 Nov 2009 21:07:05 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r882295 - /couchdb/trunk/src/couchdb/couch_rep_att.erl Date: Thu, 19 Nov 2009 21:07:05 -0000 To: commits@couchdb.apache.org From: kocolosk@apache.org X-Mailer: svnmailer-1.0.8 Message-Id: <20091119210705.E6F4A2388996@eris.apache.org> Author: kocolosk Date: Thu Nov 19 21:07:05 2009 New Revision: 882295 URL: http://svn.apache.org/viewvc?rev=882295&view=rev Log: fix replication of attachments gzipped by proxy Modified: couchdb/trunk/src/couchdb/couch_rep_att.erl Modified: couchdb/trunk/src/couchdb/couch_rep_att.erl URL: http://svn.apache.org/viewvc/couchdb/trunk/src/couchdb/couch_rep_att.erl?rev=882295&r1=882294&r2=882295&view=diff ============================================================================== --- couchdb/trunk/src/couchdb/couch_rep_att.erl (original) +++ couchdb/trunk/src/couchdb/couch_rep_att.erl Thu Nov 19 21:07:05 2009 @@ -45,25 +45,29 @@ attachment_receiver(Ref, Request) -> case get(Ref) of undefined -> - ReqId = start_http_request(Request), - put(Ref, ReqId), - receive_data(Ref, ReqId); - ReqId -> - receive_data(Ref, ReqId) + {ReqId, ContentEncoding} = start_http_request(Request), + put(Ref, {ReqId, ContentEncoding}), + receive_data(Ref, ReqId, ContentEncoding); + {ReqId, ContentEncoding} -> + receive_data(Ref, ReqId, ContentEncoding) end. -receive_data(Ref, ReqId) -> +receive_data(Ref, ReqId, ContentEncoding) -> receive {ibrowse_async_response, ReqId, {chunk_start,_}} -> - receive_data(Ref, ReqId); + receive_data(Ref, ReqId, ContentEncoding); {ibrowse_async_response, ReqId, chunk_end} -> - receive_data(Ref, ReqId); + receive_data(Ref, ReqId, ContentEncoding); {ibrowse_async_response, ReqId, {error, Err}} -> ?LOG_ERROR("streaming attachment ~p failed with ~p", [ReqId, Err]), throw({attachment_request_failed, Err}); {ibrowse_async_response, ReqId, Data} -> % ?LOG_DEBUG("got ~p bytes for ~p", [size(Data), ReqId]), - Data; + if ContentEncoding =:= "gzip" -> + zlib:gunzip(Data); + true -> + Data + end; {ibrowse_async_response_end, ReqId} -> ?LOG_ERROR("streaming att. ended but more data requested ~p", [ReqId]), throw({attachment_request_failed, premature_end}) @@ -75,23 +79,25 @@ {ibrowse_req_id, ReqId} = couch_rep_httpc:request(Req2), receive {ibrowse_async_headers, ReqId, Code, Headers} -> case validate_headers(Req2, list_to_integer(Code), Headers) of - ok -> - ReqId; - {ok, NewReqId} -> - NewReqId + {ok, ContentEncoding} -> + {ReqId, ContentEncoding}; + {ok, ContentEncoding, NewReqId} -> + {NewReqId, ContentEncoding} end end. -validate_headers(_Req, 200, _Headers) -> - ok; +validate_headers(_Req, 200, Headers) -> + MochiHeaders = mochiweb_headers:make(Headers), + {ok, mochiweb_headers:get_value("Content-Encoding", MochiHeaders)}; validate_headers(Req, Code, Headers) when Code > 299, Code < 400 -> Url = mochiweb_headers:get_value("Location",mochiweb_headers:make(Headers)), NewReq = couch_rep_httpc:redirected_request(Req, Url), {ibrowse_req_id, ReqId} = couch_rep_httpc:request(NewReq), receive {ibrowse_async_headers, ReqId, NewCode, NewHeaders} -> - ok = validate_headers(NewReq, list_to_integer(NewCode), NewHeaders) + {ok, Encoding} = validate_headers(NewReq, list_to_integer(NewCode), + NewHeaders) end, - {ok, ReqId}; + {ok, Encoding, ReqId}; validate_headers(Req, Code, _Headers) -> #http_db{url=Url, resource=Resource} = Req, ?LOG_ERROR("got ~p for ~s~s", [Code, Url, Resource]),