| Index: net/http/http_response_headers.cc
|
| diff --git a/net/http/http_response_headers.cc b/net/http/http_response_headers.cc
|
| index cc4cec4d8878678a9760449a669cbd5599c44176..408739b3876d3b838adab677f87272bd395b05a3 100644
|
| --- a/net/http/http_response_headers.cc
|
| +++ b/net/http/http_response_headers.cc
|
| @@ -627,62 +627,21 @@ HttpResponseHeaders::~HttpResponseHeaders() {
|
|
|
| // Note: this implementation implicitly assumes that line_end points at a valid
|
| // sentinel character (such as '\0').
|
| -// static
|
| -HttpVersion HttpResponseHeaders::ParseVersion(
|
| - std::string::const_iterator line_begin,
|
| - std::string::const_iterator line_end) {
|
| - std::string::const_iterator p = line_begin;
|
| -
|
| - // RFC2616 sec 3.1: HTTP-Version = "HTTP" "/" 1*DIGIT "." 1*DIGIT
|
| - // TODO: (1*DIGIT apparently means one or more digits, but we only handle 1).
|
| - // TODO: handle leading zeros, which is allowed by the rfc1616 sec 3.1.
|
| -
|
| - if ((line_end - p < 4) || !LowerCaseEqualsASCII(p, p + 4, "http")) {
|
| - DVLOG(1) << "missing status line";
|
| - return HttpVersion();
|
| - }
|
| -
|
| - p += 4;
|
| -
|
| - if (p >= line_end || *p != '/') {
|
| - DVLOG(1) << "missing version";
|
| - return HttpVersion();
|
| - }
|
| -
|
| - std::string::const_iterator dot = std::find(p, line_end, '.');
|
| - if (dot == line_end) {
|
| - DVLOG(1) << "malformed version";
|
| - return HttpVersion();
|
| - }
|
| -
|
| - ++p; // from / to first digit.
|
| - ++dot; // from . to second digit.
|
| -
|
| - if (!(*p >= '0' && *p <= '9' && *dot >= '0' && *dot <= '9')) {
|
| - DVLOG(1) << "malformed version number";
|
| - return HttpVersion();
|
| - }
|
| -
|
| - uint16 major = *p - '0';
|
| - uint16 minor = *dot - '0';
|
| -
|
| - return HttpVersion(major, minor);
|
| -}
|
| -
|
| -// Note: this implementation implicitly assumes that line_end points at a valid
|
| -// sentinel character (such as '\0').
|
| void HttpResponseHeaders::ParseStatusLine(
|
| std::string::const_iterator line_begin,
|
| std::string::const_iterator line_end,
|
| bool has_headers) {
|
| // Extract the version number
|
| - parsed_http_version_ = ParseVersion(line_begin, line_end);
|
| + std::string::const_iterator first_space =
|
| + std::find(line_begin, line_end, ' ');
|
| + std::string version(line_begin, first_space);
|
| + bool success = HttpUtil::ParseVersion(version, &parsed_http_version_);
|
|
|
| // Clamp the version number to one of: {0.9, 1.0, 1.1}
|
| - if (parsed_http_version_ == HttpVersion(0, 9) && !has_headers) {
|
| + if (success && parsed_http_version_ == HttpVersion(0, 9) && !has_headers) {
|
| http_version_ = HttpVersion(0, 9);
|
| raw_headers_ = "HTTP/0.9";
|
| - } else if (parsed_http_version_ >= HttpVersion(1, 1)) {
|
| + } else if (success && parsed_http_version_ >= HttpVersion(1, 1)) {
|
| http_version_ = HttpVersion(1, 1);
|
| raw_headers_ = "HTTP/1.1";
|
| } else {
|
| @@ -696,7 +655,7 @@ void HttpResponseHeaders::ParseStatusLine(
|
| }
|
|
|
| // TODO(eroman): this doesn't make sense if ParseVersion failed.
|
| - std::string::const_iterator p = std::find(line_begin, line_end, ' ');
|
| + std::string::const_iterator p = first_space;
|
|
|
| if (p == line_end) {
|
| DVLOG(1) << "missing response status; assuming 200 OK";
|
|
|