couchdb-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From kocol...@apache.org
Subject svn commit: r775634 - /couchdb/branches/0.9.x/src/couchdb/couch_db.erl
Date Sun, 17 May 2009 12:29:22 GMT
Author: kocolosk
Date: Sun May 17 12:29:22 2009
New Revision: 775634

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

Modified:
    couchdb/branches/0.9.x/src/couchdb/couch_db.erl

Modified: couchdb/branches/0.9.x/src/couchdb/couch_db.erl
URL: http://svn.apache.org/viewvc/couchdb/branches/0.9.x/src/couchdb/couch_db.erl?rev=775634&r1=775633&r2=775634&view=diff
==============================================================================
--- couchdb/branches/0.9.x/src/couchdb/couch_db.erl (original)
+++ couchdb/branches/0.9.x/src/couchdb/couch_db.erl Sun May 17 12:29:22 2009
@@ -649,12 +649,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(



Mime
View raw message