diff options
author | agl@chromium.org <agl@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-01-18 21:16:32 +0000 |
---|---|---|
committer | agl@chromium.org <agl@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-01-18 21:16:32 +0000 |
commit | 404653ed65af2101ee3e414801e025c46d520f10 (patch) | |
tree | 194d99d324347ba8c9e582414ea94530c2e4aa45 /net | |
parent | cf508ba3e62042daf2a3ffba2e92b6af88c75181 (diff) | |
download | chromium_src-404653ed65af2101ee3e414801e025c46d520f10.zip chromium_src-404653ed65af2101ee3e414801e025c46d520f10.tar.gz chromium_src-404653ed65af2101ee3e414801e025c46d520f10.tar.bz2 |
Revert "net: merge HTTP headers and body when the sum is small enough."
This reverts commit 118099 becauase it may have broken some layout
tests.
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@118149 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'net')
-rw-r--r-- | net/http/http_stream_parser.cc | 81 |
1 files changed, 36 insertions, 45 deletions
diff --git a/net/http/http_stream_parser.cc b/net/http/http_stream_parser.cc index bdd0f86..64248ff 100644 --- a/net/http/http_stream_parser.cc +++ b/net/http/http_stream_parser.cc @@ -1,4 +1,4 @@ -// Copyright (c) 2012 The Chromium Authors. All rights reserved. +// Copyright (c) 2011 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -22,8 +22,6 @@ namespace { -static const size_t kMaxMergedHeaderAndBodySize = 1400; - std::string GetResponseHeaderLines(const net::HttpResponseHeaders& headers) { std::string raw_headers = headers.raw_headers(); const char* null_separated_headers = raw_headers.c_str(); @@ -124,6 +122,9 @@ int HttpStreamParser::SendRequest(const std::string& request_line, response_->socket_address = HostPortPair::FromAddrInfo(address.head()); std::string request = request_line + headers.ToString(); + scoped_refptr<StringIOBuffer> headers_io_buf(new StringIOBuffer(request)); + request_headers_ = new DrainableIOBuffer(headers_io_buf, + headers_io_buf->size()); request_body_.reset(request_body); if (request_body_ != NULL && request_body_->is_chunked()) { request_body_->set_chunk_callback(this); @@ -133,48 +134,6 @@ int HttpStreamParser::SendRequest(const std::string& request_line, } io_state_ = STATE_SENDING_HEADERS; - - // If we have a small request body, then we'll merge with the headers into a - // single write. - bool did_merge = false; - if (request_body_ != NULL && - !request_body_->is_chunked() && - request_body_->size() > 0) { - size_t merged_size = request.size() + request_body_->size(); - if (merged_size <= kMaxMergedHeaderAndBodySize) { - scoped_refptr<IOBuffer> merged_request_headers_and_body( - new IOBuffer(merged_size)); - // We'll repurpose |request_headers_| to store the merged headers and - // body. - request_headers_ = new DrainableIOBuffer( - merged_request_headers_and_body, merged_size); - - char *buf = request_headers_->data(); - memcpy(buf, request.data(), request.size()); - buf += request.size(); - - size_t todo = request_body_->size(); - while (todo) { - size_t buf_len = request_body_->buf_len(); - memcpy(buf, request_body_->buf()->data(), buf_len); - todo -= buf_len; - buf += buf_len; - request_body_->MarkConsumedAndFillBuffer(buf_len); - } - - request_body_.reset(); - did_merge = true; - } - } - - if (!did_merge) { - // If we didn't merge the body with the headers, then |request_headers_| - // contains just the HTTP headers. - scoped_refptr<StringIOBuffer> headers_io_buf(new StringIOBuffer(request)); - request_headers_ = new DrainableIOBuffer(headers_io_buf, - headers_io_buf->size()); - } - result = DoLoop(OK); if (result == ERR_IO_PENDING) callback_ = callback; @@ -321,6 +280,38 @@ int HttpStreamParser::DoSendHeaders(int result) { // out the first bytes of the request headers. if (bytes_remaining == request_headers_->size()) { response_->request_time = base::Time::Now(); + + // We'll record the count of uncoalesced packets IFF coalescing will help, + // and otherwise we'll use an enum to tell why it won't help. + enum COALESCE_POTENTIAL { + // Coalescing won't reduce packet count. + NO_ADVANTAGE = 0, + // There is only a header packet or we have a request body but the + // request body isn't available yet (can't coalesce). + HEADER_ONLY = 1, + // Various cases of coalasced savings. + COALESCE_POTENTIAL_MAX = 30 + }; + size_t coalesce = HEADER_ONLY; + if (request_body_ != NULL && !request_body_->is_chunked()) { + const size_t kBytesPerPacket = 1430; + uint64 body_packets = (request_body_->size() + kBytesPerPacket - 1) / + kBytesPerPacket; + uint64 header_packets = (bytes_remaining + kBytesPerPacket - 1) / + kBytesPerPacket; + uint64 coalesced_packets = (request_body_->size() + bytes_remaining + + kBytesPerPacket - 1) / kBytesPerPacket; + if (coalesced_packets < header_packets + body_packets) { + if (coalesced_packets > COALESCE_POTENTIAL_MAX) + coalesce = COALESCE_POTENTIAL_MAX; + else + coalesce = static_cast<size_t>(header_packets + body_packets); + } else { + coalesce = NO_ADVANTAGE; + } + } + UMA_HISTOGRAM_ENUMERATION("Net.CoalescePotential", coalesce, + COALESCE_POTENTIAL_MAX); } result = connection_->socket()->Write(request_headers_, bytes_remaining, |