Index: net/http/http_network_transaction.cc |
=================================================================== |
--- net/http/http_network_transaction.cc (revision 10978) |
+++ net/http/http_network_transaction.cc (working copy) |
@@ -52,8 +52,8 @@ |
header_buf_len_(0), |
header_buf_body_offset_(-1), |
header_buf_http_offset_(-1), |
- content_length_(-1), // -1 means unspecified. |
- content_read_(0), |
+ response_body_length_(-1), // -1 means unspecified. |
+ response_body_read_(0), |
read_buf_len_(0), |
next_state_(STATE_NONE) { |
#if defined(OS_WIN) |
@@ -136,17 +136,17 @@ |
bool keep_alive = false; |
if (response_.headers->IsKeepAlive()) { |
// If there is a response body of known length, we need to drain it first. |
- if (content_length_ > 0 || chunked_decoder_.get()) { |
+ if (response_body_length_ > 0 || chunked_decoder_.get()) { |
next_state_ = STATE_DRAIN_BODY_FOR_AUTH_RESTART; |
read_buf_ = new IOBuffer(kDrainBodyBufferSize); // A bit bucket |
read_buf_len_ = kDrainBodyBufferSize; |
return; |
} |
- if (content_length_ == 0) // No response body to drain. |
+ if (response_body_length_ == 0) // No response body to drain. |
keep_alive = true; |
- // content_length_ is -1 and we're not using chunked encoding. We don't |
- // know the length of the response body, so we can't reuse this connection |
- // even though the server says it's keep-alive. |
+ // response_body_length_ is -1 and we're not using chunked encoding. We |
+ // don't know the length of the response body, so we can't reuse this |
+ // connection even though the server says it's keep-alive. |
} |
// If the auth scheme is connection-based but the proxy/server mistakenly |
@@ -796,7 +796,8 @@ |
next_state_ = STATE_READ_BODY_COMPLETE; |
// We may have already consumed the indicated content length. |
- if (content_length_ != -1 && content_read_ >= content_length_) |
+ if (response_body_length_ != -1 && |
+ response_body_read_ >= response_body_length_) |
return 0; |
// We may have some data remaining in the header buffer. |
@@ -840,16 +841,18 @@ |
// Error while reading the socket. |
done = true; |
} else { |
- content_read_ += result; |
+ response_body_read_ += result; |
if (unfiltered_eof || |
- (content_length_ != -1 && content_read_ >= content_length_) || |
+ (response_body_length_ != -1 && |
+ response_body_read_ >= response_body_length_) || |
(chunked_decoder_.get() && chunked_decoder_->reached_eof())) { |
done = true; |
keep_alive = response_.headers->IsKeepAlive(); |
// We can't reuse the connection if we read more than the advertised |
// content length. |
if (unfiltered_eof || |
- (content_length_ != -1 && content_read_ > content_length_)) |
+ (response_body_length_ != -1 && |
+ response_body_read_ > response_body_length_)) |
keep_alive = false; |
} |
} |
@@ -902,16 +905,18 @@ |
// Error while reading the socket. |
done = true; |
} else { |
- content_read_ += result; |
+ response_body_read_ += result; |
if (unfiltered_eof || |
- (content_length_ != -1 && content_read_ >= content_length_) || |
+ (response_body_length_ != -1 && |
+ response_body_read_ >= response_body_length_) || |
(chunked_decoder_.get() && chunked_decoder_->reached_eof())) { |
done = true; |
keep_alive = response_.headers->IsKeepAlive(); |
// We can't reuse the connection if we read more than the advertised |
// content length. |
if (unfiltered_eof || |
- (content_length_ != -1 && content_read_ > content_length_)) |
+ (response_body_length_ != -1 && |
+ response_body_read_ > response_body_length_)) |
keep_alive = false; |
} |
} |
@@ -934,7 +939,7 @@ |
if (!duration.InMilliseconds()) |
return; |
UMA_HISTOGRAM_COUNTS("Net.Transaction_Bandwidth", |
- static_cast<int> (content_read_ / duration.InMilliseconds())); |
+ static_cast<int> (response_body_read_ / duration.InMilliseconds())); |
} |
int HttpNetworkTransaction::DidReadResponseHeaders() { |
@@ -1023,25 +1028,37 @@ |
// Figure how to determine EOF: |
- // For certain responses, we know the content length is always 0. |
+ // For certain responses, we know the content length is always 0. From |
+ // RFC 2616 Section 4.3 Message Body: |
+ // |
+ // For response messages, whether or not a message-body is included with |
+ // a message is dependent on both the request method and the response |
+ // status code (section 6.1.1). All responses to the HEAD request method |
+ // MUST NOT include a message-body, even though the presence of entity- |
+ // header fields might lead one to believe they do. All 1xx |
+ // (informational), 204 (no content), and 304 (not modified) responses |
+ // MUST NOT include a message-body. All other responses do include a |
+ // message-body, although it MAY be of zero length. |
switch (response_.headers->response_code()) { |
case 204: // No Content |
case 205: // Reset Content |
case 304: // Not Modified |
- content_length_ = 0; |
+ response_body_length_ = 0; |
break; |
} |
+ if (request_->method == "HEAD") |
+ response_body_length_ = 0; |
- if (content_length_ == -1) { |
+ if (response_body_length_ == -1) { |
// Ignore spurious chunked responses from HTTP/1.0 servers and proxies. |
// Otherwise "Transfer-Encoding: chunked" trumps "Content-Length: N" |
if (response_.headers->GetHttpVersion() >= HttpVersion(1, 1) && |
response_.headers->HasHeaderValue("Transfer-Encoding", "chunked")) { |
chunked_decoder_.reset(new HttpChunkedDecoder()); |
} else { |
- content_length_ = response_.headers->GetContentLength(); |
- // If content_length_ is still -1, then we have to wait for the server to |
- // close the connection. |
+ response_body_length_ = response_.headers->GetContentLength(); |
+ // If response_body_length_ is still -1, then we have to wait for the |
+ // server to close the connection. |
} |
} |
@@ -1136,8 +1153,8 @@ |
header_buf_len_ = 0; |
header_buf_body_offset_ = -1; |
header_buf_http_offset_ = -1; |
- content_length_ = -1; |
- content_read_ = 0; |
+ response_body_length_ = -1; |
+ response_body_read_ = 0; |
read_buf_ = NULL; |
read_buf_len_ = 0; |
request_headers_.clear(); |