Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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 #include "net/tools/balsa/balsa_frame.h" | 5 #include "net/tools/balsa/balsa_frame.h" |
| 6 | 6 |
| 7 #include <assert.h> | 7 #include <assert.h> |
| 8 #if __SSE2__ | 8 #if __SSE2__ |
| 9 #include <emmintrin.h> | 9 #include <emmintrin.h> |
| 10 #endif // __SSE2__ | 10 #endif // __SSE2__ |
| 11 #include <strings.h> | |
| 12 | 11 |
| 13 #include <limits> | 12 #include <limits> |
| 14 #include <string> | 13 #include <string> |
| 15 #include <utility> | 14 #include <utility> |
| 16 #include <vector> | 15 #include <vector> |
| 17 | 16 |
| 18 #include "base/logging.h" | 17 #include "base/logging.h" |
| 19 #include "base/port.h" | 18 #include "base/port.h" |
| 20 #include "base/strings/string_piece.h" | 19 #include "base/strings/string_piece.h" |
| 21 #include "net/tools/balsa/balsa_enums.h" | 20 #include "net/tools/balsa/balsa_enums.h" |
| 22 #include "net/tools/balsa/balsa_headers.h" | 21 #include "net/tools/balsa/balsa_headers.h" |
| 23 #include "net/tools/balsa/balsa_visitor_interface.h" | 22 #include "net/tools/balsa/balsa_visitor_interface.h" |
| 24 #include "net/tools/balsa/buffer_interface.h" | 23 #include "net/tools/balsa/buffer_interface.h" |
| 25 #include "net/tools/balsa/simple_buffer.h" | 24 #include "net/tools/balsa/simple_buffer.h" |
| 26 #include "net/tools/balsa/split.h" | 25 #include "net/tools/balsa/split.h" |
| 27 #include "net/tools/balsa/string_piece_utils.h" | 26 #include "net/tools/balsa/string_piece_utils.h" |
| 28 | 27 |
| 28 #if defined(COMPILER_MSVC) | |
| 29 #include <string.h> | |
| 30 #define strncasecmp _strnicmp | |
| 31 #else | |
| 32 #include <strings.h> | |
| 33 #endif | |
| 34 | |
| 29 namespace net { | 35 namespace net { |
| 30 | 36 |
| 31 // Constants holding some header names for headers which can affect the way the | 37 // Constants holding some header names for headers which can affect the way the |
| 32 // HTTP message is framed, and so must be processed specially: | 38 // HTTP message is framed, and so must be processed specially: |
| 33 static const char kContentLength[] = "content-length"; | 39 static const char kContentLength[] = "content-length"; |
| 34 static const size_t kContentLengthSize = sizeof(kContentLength) - 1; | 40 static const size_t kContentLengthSize = sizeof(kContentLength) - 1; |
| 35 static const char kTransferEncoding[] = "transfer-encoding"; | 41 static const char kTransferEncoding[] = "transfer-encoding"; |
| 36 static const size_t kTransferEncodingSize = sizeof(kTransferEncoding) - 1; | 42 static const size_t kTransferEncodingSize = sizeof(kTransferEncoding) - 1; |
| 37 | 43 |
| 38 BalsaFrame::BalsaFrame() | 44 BalsaFrame::BalsaFrame() |
| (...skipping 380 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 419 &last_error_)) { | 425 &last_error_)) { |
| 420 parse_state_ = BalsaFrameEnums::PARSE_ERROR; | 426 parse_state_ = BalsaFrameEnums::PARSE_ERROR; |
| 421 visitor_->HandleHeaderError(this); | 427 visitor_->HandleHeaderError(this); |
| 422 return; | 428 return; |
| 423 } | 429 } |
| 424 if (previous_error != last_error_) { | 430 if (previous_error != last_error_) { |
| 425 visitor_->HandleHeaderWarning(this); | 431 visitor_->HandleHeaderWarning(this); |
| 426 } | 432 } |
| 427 | 433 |
| 428 if (is_request_) { | 434 if (is_request_) { |
| 429 int version_length = | 435 size_t version_length = |
| 430 headers_->whitespace_4_idx_ - headers_->non_whitespace_3_idx_; | 436 headers_->whitespace_4_idx_ - headers_->non_whitespace_3_idx_; |
| 431 visitor_->ProcessRequestFirstLine( | 437 visitor_->ProcessRequestFirstLine( |
| 432 begin + headers_->non_whitespace_1_idx_, | 438 begin + headers_->non_whitespace_1_idx_, |
| 433 headers_->whitespace_4_idx_ - headers_->non_whitespace_1_idx_, | 439 headers_->whitespace_4_idx_ - headers_->non_whitespace_1_idx_, |
| 434 begin + headers_->non_whitespace_1_idx_, | 440 begin + headers_->non_whitespace_1_idx_, |
| 435 headers_->whitespace_2_idx_ - headers_->non_whitespace_1_idx_, | 441 headers_->whitespace_2_idx_ - headers_->non_whitespace_1_idx_, |
| 436 begin + headers_->non_whitespace_2_idx_, | 442 begin + headers_->non_whitespace_2_idx_, |
| 437 headers_->whitespace_3_idx_ - headers_->non_whitespace_2_idx_, | 443 headers_->whitespace_3_idx_ - headers_->non_whitespace_2_idx_, |
| 438 begin + headers_->non_whitespace_3_idx_, | 444 begin + headers_->non_whitespace_3_idx_, |
| 439 version_length); | 445 version_length); |
| (...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 569 while (current < header_lines_end_m16) { | 575 while (current < header_lines_end_m16) { |
| 570 __m128i header_bytes = | 576 __m128i header_bytes = |
| 571 _mm_loadu_si128(reinterpret_cast<const __m128i *>(current)); | 577 _mm_loadu_si128(reinterpret_cast<const __m128i *>(current)); |
| 572 __m128i colon_cmp = | 578 __m128i colon_cmp = |
| 573 _mm_cmpeq_epi8(header_bytes, reinterpret_cast<__m128i>(colons)); | 579 _mm_cmpeq_epi8(header_bytes, reinterpret_cast<__m128i>(colons)); |
| 574 int colon_msk = _mm_movemask_epi8(colon_cmp); | 580 int colon_msk = _mm_movemask_epi8(colon_cmp); |
| 575 if (colon_msk == 0) { | 581 if (colon_msk == 0) { |
| 576 current += 16; | 582 current += 16; |
| 577 continue; | 583 continue; |
| 578 } | 584 } |
| 579 current += (ffs(colon_msk) - 1); | 585 current += (ffs(colon_msk) - 1); |
|
Nico
2014/07/04 00:27:31
I believe ffs() is only available if strings.h was
wtc
2014/07/07 16:50:16
Chromium uses the code in net/tools/balsa only in
| |
| 580 if (current > line_end) { | 586 if (current > line_end) { |
| 581 break; | 587 break; |
| 582 } | 588 } |
| 583 goto found_colon; | 589 goto found_colon; |
| 584 } | 590 } |
| 585 #endif // __SSE2__ | 591 #endif // __SSE2__ |
| 586 for (; current < line_end; ++current) { | 592 for (; current < line_end; ++current) { |
| 587 if (*current != ':') { | 593 if (*current != ':') { |
| 588 continue; | 594 continue; |
| 589 } | 595 } |
| (...skipping 959 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1549 << BalsaFrameEnums::ParseStateToString(parse_state_) | 1555 << BalsaFrameEnums::ParseStateToString(parse_state_) |
| 1550 << "$$$$$$$$$$$$$$$" | 1556 << "$$$$$$$$$$$$$$$" |
| 1551 << " consumed: " << (current - input); | 1557 << " consumed: " << (current - input); |
| 1552 if (Error()) { | 1558 if (Error()) { |
| 1553 LOG(INFO) << BalsaFrameEnums::ErrorCodeToString(ErrorCode()); | 1559 LOG(INFO) << BalsaFrameEnums::ErrorCodeToString(ErrorCode()); |
| 1554 } | 1560 } |
| 1555 #endif // DEBUGFRAMER | 1561 #endif // DEBUGFRAMER |
| 1556 return current - input; | 1562 return current - input; |
| 1557 } | 1563 } |
| 1558 | 1564 |
| 1559 const uint32 BalsaFrame::kValidTerm1; | |
| 1560 const uint32 BalsaFrame::kValidTerm1Mask; | |
| 1561 const uint32 BalsaFrame::kValidTerm2; | |
| 1562 const uint32 BalsaFrame::kValidTerm2Mask; | |
| 1563 | |
| 1564 } // namespace net | 1565 } // namespace net |
| OLD | NEW |