| Index: net/quic/core/spdy_utils.cc
|
| diff --git a/net/quic/core/spdy_utils.cc b/net/quic/core/spdy_utils.cc
|
| index 33917f4674db4f195a81e26ba5090f5b964cc6ed..aab7f6f6895e6837b1a803309f1b696c83e77a67 100644
|
| --- a/net/quic/core/spdy_utils.cc
|
| +++ b/net/quic/core/spdy_utils.cc
|
| @@ -19,6 +19,7 @@
|
| #include "url/gurl.h"
|
|
|
| using base::StringPiece;
|
| +using base::ContainsKey;
|
| using std::string;
|
| using std::vector;
|
|
|
| @@ -47,34 +48,39 @@ bool SpdyUtils::ParseHeaders(const char* data,
|
| return false; // Headers were invalid.
|
| }
|
|
|
| + if (!ContainsKey(*headers, "content-length")) {
|
| + return true;
|
| + }
|
| +
|
| return ExtractContentLengthFromHeaders(content_length, headers);
|
| }
|
|
|
| // static
|
| bool SpdyUtils::ExtractContentLengthFromHeaders(int64_t* content_length,
|
| SpdyHeaderBlock* headers) {
|
| - if (base::ContainsKey(*headers, "content-length")) {
|
| - // Check whether multiple values are consistent.
|
| - base::StringPiece content_length_header = (*headers)["content-length"];
|
| - vector<string> values =
|
| - base::SplitString(content_length_header, base::StringPiece("\0", 1),
|
| - base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL);
|
| - for (const string& value : values) {
|
| - int64_t new_value;
|
| - if (!base::StringToInt64(value, &new_value) || new_value < 0) {
|
| - DLOG(ERROR) << "Content length was either unparseable or negative.";
|
| - return false;
|
| - }
|
| - if (*content_length < 0) {
|
| - *content_length = new_value;
|
| - continue;
|
| - }
|
| - if (new_value != *content_length) {
|
| - DLOG(ERROR) << "Parsed content length " << new_value << " is "
|
| - << "inconsistent with previously detected content length "
|
| - << *content_length;
|
| - return false;
|
| - }
|
| + if (!ContainsKey(*headers, "content-length")) {
|
| + return false;
|
| + }
|
| + // Check whether multiple values are consistent.
|
| + base::StringPiece content_length_header = (*headers)["content-length"];
|
| + vector<string> values =
|
| + base::SplitString(content_length_header, base::StringPiece("\0", 1),
|
| + base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL);
|
| + for (const string& value : values) {
|
| + int64_t new_value;
|
| + if (!base::StringToInt64(value, &new_value) || new_value < 0) {
|
| + DLOG(ERROR) << "Content length was either unparseable or negative.";
|
| + return false;
|
| + }
|
| + if (*content_length < 0) {
|
| + *content_length = new_value;
|
| + continue;
|
| + }
|
| + if (new_value != *content_length) {
|
| + DLOG(ERROR) << "Parsed content length " << new_value << " is "
|
| + << "inconsistent with previously detected content length "
|
| + << *content_length;
|
| + return false;
|
| }
|
| }
|
| return true;
|
| @@ -139,7 +145,8 @@ bool SpdyUtils::CopyAndValidateHeaders(const QuicHeaderList& header_list,
|
| headers->AppendValueOrAddHeader(name, p.second);
|
| }
|
|
|
| - if (!ExtractContentLengthFromHeaders(content_length, headers)) {
|
| + if (ContainsKey(*headers, "content-length") &&
|
| + !ExtractContentLengthFromHeaders(content_length, headers)) {
|
| return false;
|
| }
|
|
|
|
|