diff options
author | Robert Newson <rnewson@apache.org> | 2011-05-26 19:00:29 +0000 |
---|---|---|
committer | Robert Newson <rnewson@apache.org> | 2011-05-26 19:00:29 +0000 |
commit | d5aa8379b531c664bbad0a364fc19729f1e30315 (patch) | |
tree | c5875644cc3dc22e9aac9b707702b2f2eaa623de /src/couchdb/couch_db.erl | |
parent | 7c719fe3b113f03e37aced91ab28957e2c4aeab3 (diff) |
COUCHDB-1177 - don't read more of an attachment than Content-Length states.
(original patch by Paul Davis, awesomeness enhanced by Robert Newson).
git-svn-id: https://svn.apache.org/repos/asf/couchdb/branches/1.1.x@1128040 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'src/couchdb/couch_db.erl')
-rw-r--r-- | src/couchdb/couch_db.erl | 7 |
1 files changed, 6 insertions, 1 deletions
diff --git a/src/couchdb/couch_db.erl b/src/couchdb/couch_db.erl index 40d84618..17402c81 100644 --- a/src/couchdb/couch_db.erl +++ b/src/couchdb/couch_db.erl @@ -923,10 +923,15 @@ with_stream(Fd, #att{md5=InMd5,type=Type,encoding=Enc}=Att, Fun) -> write_streamed_attachment(_Stream, _F, 0) -> ok; write_streamed_attachment(Stream, F, LenLeft) when LenLeft > 0 -> - Bin = F(), + Bin = read_next_chunk(F, LenLeft), ok = couch_stream:write(Stream, Bin), write_streamed_attachment(Stream, F, LenLeft - size(Bin)). +read_next_chunk(F, _) when is_function(F, 0) -> + F(); +read_next_chunk(F, LenLeft) when is_function(F, 1) -> + F(lists:min([LenLeft, 16#2000])). + enum_docs_since_reduce_to_count(Reds) -> couch_btree:final_reduce( fun couch_db_updater:btree_by_seq_reduce/2, Reds). |