From e5048b3a8084d4ec8e1db76cde03d108a316003b Mon Sep 17 00:00:00 2001 From: Robert Sesek Date: Fri, 7 Nov 2014 12:08:14 -0500 Subject: [PATCH] In CompositeHTTPBodyStream, coalesce small GetBytesBuffer()s to better fill the buffer. R=mark@chromium.org Review URL: https://codereview.chromium.org/707223002 --- util/net/http_body.cc | 27 ++++++++++++++++----------- util/net/http_body_test.cc | 2 +- 2 files changed, 17 insertions(+), 12 deletions(-) diff --git a/util/net/http_body.cc b/util/net/http_body.cc index cd31ab4f..0e5daa34 100644 --- a/util/net/http_body.cc +++ b/util/net/http_body.cc @@ -97,20 +97,25 @@ CompositeHTTPBodyStream::~CompositeHTTPBodyStream() { } ssize_t CompositeHTTPBodyStream::GetBytesBuffer(uint8_t* buffer, - size_t max_len) { - if (current_part_ == parts_.end()) - return 0; + size_t buffer_len) { + ssize_t max_len = std::min( + buffer_len, implicit_cast(std::numeric_limits::max())); + ssize_t bytes_copied = 0; + while (bytes_copied < max_len && current_part_ != parts_.end()) { + ssize_t this_read = (*current_part_)->GetBytesBuffer( + buffer + bytes_copied, max_len - bytes_copied); - ssize_t rv = (*current_part_)->GetBytesBuffer(buffer, max_len); - - if (rv == 0) { - // If the current part has returned 0 indicating EOF, advance the current - // part and call recursively to try again. - ++current_part_; - return GetBytesBuffer(buffer, max_len); + if (this_read == 0) { + // If the current part has returned 0 indicating EOF, advance the current + // part and try again. + ++current_part_; + } else if (this_read < 0) { + return this_read; + } + bytes_copied += this_read; } - return rv; + return bytes_copied; } } // namespace crashpad diff --git a/util/net/http_body_test.cc b/util/net/http_body_test.cc index d6504978..c59b6d6b 100644 --- a/util/net/http_body_test.cc +++ b/util/net/http_body_test.cc @@ -214,7 +214,7 @@ TEST_P(CompositeHTTPBodyStreamBufferSize, StringsAndFile) { INSTANTIATE_TEST_CASE_P(VariableBufferSize, CompositeHTTPBodyStreamBufferSize, - testing::Values(1, 2, 9, 16, 31, 128)); + testing::Values(1, 2, 9, 16, 31, 128, 1024)); } // namespace } // namespace test