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/05/17 19:51:42 UTC

svn commit: r775724 - in /couchdb/trunk: ./ etc/default/couchdb src/couchdb/couch_db.erl

Author: kocolosk
Date: Sun May 17 17:51:42 2009
New Revision: 775724

URL: http://svn.apache.org/viewvc?rev=775724&view=rev
Log:
work around ibrowse giving response chunks too many bytes. Thanks Antony.

Initially committed on the 0.9.x branch by accident in 775634.  We want to
include this in 0.9.1 anyway, though, so shouldn't ultimately be a problem.

Modified:
    couchdb/trunk/   (props changed)
    couchdb/trunk/etc/default/couchdb   (props changed)
    couchdb/trunk/src/couchdb/couch_db.erl

Propchange: couchdb/trunk/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Sun May 17 17:51:42 2009
@@ -1,2 +1,3 @@
+/couchdb/branches/0.9.x:775634
 /couchdb/branches/design_resources:751716-751803
 /couchdb/branches/form:729440-730015

Propchange: couchdb/trunk/etc/default/couchdb
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Sun May 17 17:51:42 2009
@@ -1,3 +1,4 @@
+/couchdb/branches/0.9.x/etc/default/couchdb:775634
 /couchdb/branches/design_resources/etc/default/couchdb:751716-751803
 /couchdb/branches/form/etc/default/couchdb:729440-730015
 /incubator/couchdb/trunk/etc/default/couchdb:642419-694440

Modified: couchdb/trunk/src/couchdb/couch_db.erl
URL: http://svn.apache.org/viewvc/couchdb/trunk/src/couchdb/couch_db.erl?rev=775724&r1=775723&r2=775724&view=diff
==============================================================================
--- couchdb/trunk/src/couchdb/couch_db.erl (original)
+++ couchdb/trunk/src/couchdb/couch_db.erl Sun May 17 17:51:42 2009
@@ -644,12 +644,24 @@
     {ok, SpAcc};
 write_streamed_attachment(Stream, F, LenLeft, nil) ->
     Bin = F(),
-    {ok, StreamPointer} = couch_stream:write(Stream, Bin),
-    write_streamed_attachment(Stream, F, LenLeft - size(Bin), StreamPointer);
+    TruncatedBin = check_bin_length(LenLeft, Bin),
+    {ok, SpAcc} = couch_stream:write(Stream, TruncatedBin),
+    write_streamed_attachment(Stream, F, LenLeft - size(TruncatedBin), SpAcc);
 write_streamed_attachment(Stream, F, LenLeft, SpAcc) ->
     Bin = F(),
-    {ok, _} = couch_stream:write(Stream, Bin),
-    write_streamed_attachment(Stream, F, LenLeft - size(Bin), SpAcc).
+    TruncatedBin = check_bin_length(LenLeft, Bin),
+    {ok, _} = couch_stream:write(Stream, TruncatedBin),
+    write_streamed_attachment(Stream, F, LenLeft - size(TruncatedBin), SpAcc).
+
+%% on rare occasions ibrowse seems to process a chunked response incorrectly
+%% and include an extra "\r" in the last chunk.  This code ensures that we 
+%% truncate the downloaed attachment at the length specified in the metadata.
+check_bin_length(LenLeft, Bin) when size(Bin) > LenLeft ->
+    <<ValidData:LenLeft/binary, Crap/binary>> = Bin,
+    ?LOG_ERROR("write_streamed_attachment has written too much expected: ~p" ++
+        " got: ~p tail: ~p", [LenLeft, size(Bin), Crap]),
+    ValidData;
+check_bin_length(_, Bin) -> Bin.
 
 enum_docs_since_reduce_to_count(Reds) ->
     couch_btree:final_reduce(