| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 // The rules for header parsing were borrowed from Firefox: | 5 // The rules for header parsing were borrowed from Firefox: |
| 6 // http://lxr.mozilla.org/seamonkey/source/netwerk/protocol/http/src/nsHttpRespo
nseHead.cpp | 6 // http://lxr.mozilla.org/seamonkey/source/netwerk/protocol/http/src/nsHttpRespo
nseHead.cpp |
| 7 // The rules for parsing content-types were also borrowed from Firefox: | 7 // The rules for parsing content-types were also borrowed from Firefox: |
| 8 // http://lxr.mozilla.org/mozilla/source/netwerk/base/src/nsURLHelper.cpp#834 | 8 // http://lxr.mozilla.org/mozilla/source/netwerk/base/src/nsURLHelper.cpp#834 |
| 9 | 9 |
| 10 #include "net/http/http_response_headers.h" | 10 #include "net/http/http_response_headers.h" |
| (...skipping 610 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 621 | 621 |
| 622 // Note: this implementation implicitly assumes that line_end points at a valid | 622 // Note: this implementation implicitly assumes that line_end points at a valid |
| 623 // sentinel character (such as '\0'). | 623 // sentinel character (such as '\0'). |
| 624 // static | 624 // static |
| 625 HttpVersion HttpResponseHeaders::ParseVersion( | 625 HttpVersion HttpResponseHeaders::ParseVersion( |
| 626 std::string::const_iterator line_begin, | 626 std::string::const_iterator line_begin, |
| 627 std::string::const_iterator line_end) { | 627 std::string::const_iterator line_end) { |
| 628 std::string::const_iterator p = line_begin; | 628 std::string::const_iterator p = line_begin; |
| 629 | 629 |
| 630 // RFC2616 sec 3.1: HTTP-Version = "HTTP" "/" 1*DIGIT "." 1*DIGIT | 630 // RFC2616 sec 3.1: HTTP-Version = "HTTP" "/" 1*DIGIT "." 1*DIGIT |
| 631 // TODO: (1*DIGIT apparently means one or more digits, but we only handle 1). | 631 // 1*DIGIT means one or more digits. |
| 632 // TODO: handle leading zeros, which is allowed by the rfc1616 sec 3.1. | 632 // TODO: handle leading zeros, which is allowed by the rfc1616 sec 3.1. |
| 633 | 633 |
| 634 if ((line_end - p < 4) || !LowerCaseEqualsASCII(p, p + 4, "http")) { | 634 if ((line_end - p < 4) || !LowerCaseEqualsASCII(p, p + 4, "http")) { |
| 635 DVLOG(1) << "missing status line"; | 635 DVLOG(1) << "missing status line"; |
| 636 return HttpVersion(); | 636 return HttpVersion(); |
| 637 } | 637 } |
| 638 | 638 |
| 639 p += 4; | 639 p += 4; |
| 640 | 640 |
| 641 if (p >= line_end || *p != '/') { | 641 if (p >= line_end || *p != '/') { |
| 642 DVLOG(1) << "missing version"; | 642 DVLOG(1) << "missing version"; |
| 643 return HttpVersion(); | 643 return HttpVersion(); |
| 644 } | 644 } |
| 645 | 645 |
| 646 std::string::const_iterator dot = std::find(p, line_end, '.'); | 646 std::string::const_iterator dot = std::find(p, line_end, '.'); |
| 647 if (dot == line_end) { | 647 if (dot == line_end) { |
| 648 DVLOG(1) << "malformed version"; | 648 DVLOG(1) << "malformed version"; |
| 649 return HttpVersion(); | 649 return HttpVersion(); |
| 650 } | 650 } |
| 651 | 651 |
| 652 ++p; // from / to first digit. | 652 ++p; // from / to dot digits. |
| 653 ++dot; // from . to second digit. | |
| 654 | 653 |
| 655 if (!(*p >= '0' && *p <= '9' && *dot >= '0' && *dot <= '9')) { | 654 std::string::const_iterator version_major = p; |
| 655 // std::string version_major = ""; |
| 656 for (; version_major != dot; ++version_major) { |
| 657 if (!(*version_major >= '0' && *version_major <= '9')) { |
| 658 DVLOG(1) << "malformed version number"; |
| 659 return HttpVersion(); |
| 660 } |
| 661 } |
| 662 |
| 663 ++dot; // from . to end digits. |
| 664 |
| 665 if (!(*dot >= '0' && *dot <= '9')) { |
| 656 DVLOG(1) << "malformed version number"; | 666 DVLOG(1) << "malformed version number"; |
| 657 return HttpVersion(); | 667 return HttpVersion(); |
| 658 } | 668 } |
| 659 | 669 |
| 660 uint16 major = *p - '0'; | 670 // std::string version_minor = ""; |
| 661 uint16 minor = *dot - '0'; | 671 std::string::const_iterator version_minor = dot; |
| 672 for (; (*version_minor >= '0' && *version_minor <= '9'); ++version_minor) { |
| 673 // version_minor += *dot; |
| 674 } |
| 675 uint major_version_number, minor_version_number; |
| 676 if (!base::StringToUint(StringPiece(p, version_major), &major_version_number)) |
| 677 return HttpVersion(); |
| 678 if (!base::StringToUint(StringPiece(dot, version_minor), |
| 679 &minor_version_number)) |
| 680 return HttpVersion(); |
| 681 if (major_version_number > UINT16_MAX || minor_version_number > UINT16_MAX) { |
| 682 DVLOG(1) << "malformed version number"; |
| 683 return HttpVersion(); |
| 684 } |
| 685 |
| 686 uint16 major = static_cast<uint16>(major_version_number); |
| 687 uint16 minor = static_cast<uint16>(minor_version_number); |
| 662 | 688 |
| 663 return HttpVersion(major, minor); | 689 return HttpVersion(major, minor); |
| 664 } | 690 } |
| 665 | 691 |
| 666 // Note: this implementation implicitly assumes that line_end points at a valid | 692 // Note: this implementation implicitly assumes that line_end points at a valid |
| 667 // sentinel character (such as '\0'). | 693 // sentinel character (such as '\0'). |
| 668 void HttpResponseHeaders::ParseStatusLine( | 694 void HttpResponseHeaders::ParseStatusLine( |
| 669 std::string::const_iterator line_begin, | 695 std::string::const_iterator line_begin, |
| 670 std::string::const_iterator line_end, | 696 std::string::const_iterator line_end, |
| 671 bool has_headers) { | 697 bool has_headers) { |
| (...skipping 772 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1444 return true; | 1470 return true; |
| 1445 } | 1471 } |
| 1446 | 1472 |
| 1447 bool HttpResponseHeaders::IsChunkEncoded() const { | 1473 bool HttpResponseHeaders::IsChunkEncoded() const { |
| 1448 // Ignore spurious chunked responses from HTTP/1.0 servers and proxies. | 1474 // Ignore spurious chunked responses from HTTP/1.0 servers and proxies. |
| 1449 return GetHttpVersion() >= HttpVersion(1, 1) && | 1475 return GetHttpVersion() >= HttpVersion(1, 1) && |
| 1450 HasHeaderValue("Transfer-Encoding", "chunked"); | 1476 HasHeaderValue("Transfer-Encoding", "chunked"); |
| 1451 } | 1477 } |
| 1452 | 1478 |
| 1453 } // namespace net | 1479 } // namespace net |
| OLD | NEW |