currentOffset += len;
}
-size_t ServerStateData::replyBodySpace(size_t space)
+size_t ServerStateData::replyBodySpace(const MemBuf &readBuf,
+ const size_t minSpace) const
{
+ size_t space = readBuf.spaceSize(); // available space w/o heroic measures
+ if (space < minSpace) {
+ const size_t maxSpace = readBuf.potentialSpaceSize(); // absolute best
+ space = min(minSpace, maxSpace); // do not promise more than asked
+ }
+
#if USE_ADAPTATION
if (responseBodyBuffer) {
return 0; // Stop reading if already overflowed waiting for ICAP to catch up
void adaptOrFinalizeReply();
void addVirginReplyBody(const char *buf, ssize_t len);
void storeReplyBody(const char *buf, ssize_t len);
- size_t replyBodySpace(size_t space = 4096 * 10);
+ size_t replyBodySpace(const MemBuf &readBuf, const size_t minSpace) const;
// These should be private
int64_t currentOffset; /**< Our current offset in the StoreEntry */
if (data.read_pending)
return;
- int read_sz = replyBodySpace(data.readBuf->spaceSize());
+ const int read_sz = replyBodySpace(*data.readBuf, 0);
debugs(11,9, HERE << "FTP may read up to " << read_sz << " bytes");
void
HttpStateData::maybeReadVirginBody()
{
- int read_sz = replyBodySpace(readBuf->spaceSize());
+ // we may need to grow the buffer if headers do not fit
+ const int minRead = flags.headers_parsed ? 0 : 1024;
+ const int read_sz = replyBodySpace(*readBuf, minRead);
debugs(11,9, HERE << (flags.do_next_read ? "may" : "wont") <<
" read up to " << read_sz << " bytes from FD " << fd);
* handler until we get a notification from someone that
* its okay to read again.
*/
- if (read_sz < 2) {
- if (flags.headers_parsed)
- return;
- else
- read_sz = 1024;
- }
+ if (read_sz < 2)
+ return;
if (flags.do_next_read) {
flags.do_next_read = 0;