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(