| 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 #include <algorithm> | 5 #include <algorithm> |
| 6 #include <iostream> | 6 #include <iostream> |
| 7 #include <limits> | 7 #include <limits> |
| 8 | 8 |
| 9 #include "base/compiler_specific.h" | 9 #include "base/compiler_specific.h" |
| 10 #include "base/memory/scoped_ptr.h" | 10 #include "base/memory/scoped_ptr.h" |
| 11 #include "net/spdy/hpack_output_stream.h" | 11 #include "net/spdy/hpack_output_stream.h" |
| 12 #include "net/spdy/mock_spdy_framer_visitor.h" | 12 #include "net/spdy/mock_spdy_framer_visitor.h" |
| 13 #include "net/spdy/spdy_frame_builder.h" | 13 #include "net/spdy/spdy_frame_builder.h" |
| 14 #include "net/spdy/spdy_frame_reader.h" |
| 14 #include "net/spdy/spdy_framer.h" | 15 #include "net/spdy/spdy_framer.h" |
| 15 #include "net/spdy/spdy_protocol.h" | 16 #include "net/spdy/spdy_protocol.h" |
| 16 #include "net/spdy/spdy_test_utils.h" | 17 #include "net/spdy/spdy_test_utils.h" |
| 17 #include "testing/gmock/include/gmock/gmock.h" | 18 #include "testing/gmock/include/gmock/gmock.h" |
| 18 #include "testing/platform_test.h" | 19 #include "testing/platform_test.h" |
| 19 | 20 |
| 20 using base::StringPiece; | 21 using base::StringPiece; |
| 21 using std::string; | 22 using std::string; |
| 22 using std::max; | 23 using std::max; |
| 23 using std::min; | 24 using std::min; |
| (...skipping 269 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 293 size_t len) OVERRIDE { | 294 size_t len) OVERRIDE { |
| 294 ++control_frame_header_data_count_; | 295 ++control_frame_header_data_count_; |
| 295 CHECK_EQ(header_stream_id_, stream_id); | 296 CHECK_EQ(header_stream_id_, stream_id); |
| 296 if (len == 0) { | 297 if (len == 0) { |
| 297 ++zero_length_control_frame_header_data_count_; | 298 ++zero_length_control_frame_header_data_count_; |
| 298 // Indicates end-of-header-block. | 299 // Indicates end-of-header-block. |
| 299 headers_.clear(); | 300 headers_.clear(); |
| 300 CHECK(header_buffer_valid_); | 301 CHECK(header_buffer_valid_); |
| 301 size_t parsed_length = framer_.ParseHeaderBlockInBuffer( | 302 size_t parsed_length = framer_.ParseHeaderBlockInBuffer( |
| 302 header_buffer_.get(), header_buffer_length_, &headers_); | 303 header_buffer_.get(), header_buffer_length_, &headers_); |
| 303 DCHECK_EQ(header_buffer_length_, parsed_length); | 304 LOG_IF(DFATAL, header_buffer_length_ != parsed_length) |
| 305 << "Check failed: header_buffer_length_ == parsed_length " |
| 306 << "(" << header_buffer_length_ << " vs. " << parsed_length << ")"; |
| 304 return true; | 307 return true; |
| 305 } | 308 } |
| 306 const size_t available = header_buffer_size_ - header_buffer_length_; | 309 const size_t available = header_buffer_size_ - header_buffer_length_; |
| 307 if (len > available) { | 310 if (len > available) { |
| 308 header_buffer_valid_ = false; | 311 header_buffer_valid_ = false; |
| 309 return false; | 312 return false; |
| 310 } | 313 } |
| 311 memcpy(header_buffer_.get() + header_buffer_length_, header_data, len); | 314 memcpy(header_buffer_.get() + header_buffer_length_, header_data, len); |
| 312 header_buffer_length_ += len; | 315 header_buffer_length_ += len; |
| 313 return true; | 316 return true; |
| (...skipping 171 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 485 // Header block streaming state: | 488 // Header block streaming state: |
| 486 scoped_ptr<char[]> header_buffer_; | 489 scoped_ptr<char[]> header_buffer_; |
| 487 size_t header_buffer_length_; | 490 size_t header_buffer_length_; |
| 488 size_t header_buffer_size_; | 491 size_t header_buffer_size_; |
| 489 SpdyStreamId header_stream_id_; | 492 SpdyStreamId header_stream_id_; |
| 490 SpdyFrameType header_control_type_; | 493 SpdyFrameType header_control_type_; |
| 491 bool header_buffer_valid_; | 494 bool header_buffer_valid_; |
| 492 SpdyHeaderBlock headers_; | 495 SpdyHeaderBlock headers_; |
| 493 }; | 496 }; |
| 494 | 497 |
| 495 // Retrieves serialized headers from SYN_STREAM frame. | 498 // Retrieves serialized headers from a HEADERS or SYN_STREAM frame. |
| 496 // Does not check that the given frame is a SYN_STREAM. | |
| 497 base::StringPiece GetSerializedHeaders(const SpdyFrame* frame, | 499 base::StringPiece GetSerializedHeaders(const SpdyFrame* frame, |
| 498 const SpdyFramer& framer) { | 500 const SpdyFramer& framer) { |
| 499 return base::StringPiece(frame->data() + framer.GetSynStreamMinimumSize(), | 501 SpdyFrameReader reader(frame->data(), frame->size()); |
| 500 frame->size() - framer.GetSynStreamMinimumSize()); | 502 reader.Seek(2); // Seek past the frame length. |
| 503 SpdyFrameType frame_type; |
| 504 if (framer.protocol_version() > SPDY3) { |
| 505 uint8 serialized_type; |
| 506 reader.ReadUInt8(&serialized_type); |
| 507 frame_type = SpdyConstants::ParseFrameType(framer.protocol_version(), |
| 508 serialized_type); |
| 509 DCHECK_EQ(HEADERS, frame_type); |
| 510 uint8 flags; |
| 511 reader.ReadUInt8(&flags); |
| 512 if (flags & HEADERS_FLAG_PRIORITY) { |
| 513 frame_type = SYN_STREAM; |
| 514 } |
| 515 } else { |
| 516 uint16 serialized_type; |
| 517 reader.ReadUInt16(&serialized_type); |
| 518 frame_type = SpdyConstants::ParseFrameType(framer.protocol_version(), |
| 519 serialized_type); |
| 520 DCHECK(frame_type == HEADERS || |
| 521 frame_type == SYN_STREAM) << frame_type; |
| 522 } |
| 523 |
| 524 if (frame_type == SYN_STREAM) { |
| 525 return StringPiece(frame->data() + framer.GetSynStreamMinimumSize(), |
| 526 frame->size() - framer.GetSynStreamMinimumSize()); |
| 527 } else { |
| 528 return StringPiece(frame->data() + framer.GetHeadersMinimumSize(), |
| 529 frame->size() - framer.GetHeadersMinimumSize()); |
| 530 } |
| 501 } | 531 } |
| 502 | 532 |
| 503 } // namespace test | 533 } // namespace test |
| 504 | 534 |
| 505 } // namespace net | 535 } // namespace net |
| 506 | 536 |
| 507 using net::test::SetFrameLength; | 537 using net::test::SetFrameLength; |
| 508 using net::test::SetFrameFlags; | 538 using net::test::SetFrameFlags; |
| 509 using net::test::CompareCharArraysWithHexError; | 539 using net::test::CompareCharArraysWithHexError; |
| 510 using net::test::SpdyFramerTestUtil; | 540 using net::test::SpdyFramerTestUtil; |
| (...skipping 4225 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4736 SpdyBlockedIR blocked_ir(0); | 4766 SpdyBlockedIR blocked_ir(0); |
| 4737 scoped_ptr<SpdySerializedFrame> frame(framer.SerializeFrame(blocked_ir)); | 4767 scoped_ptr<SpdySerializedFrame> frame(framer.SerializeFrame(blocked_ir)); |
| 4738 framer.ProcessInput(frame->data(), framer.GetBlockedSize()); | 4768 framer.ProcessInput(frame->data(), framer.GetBlockedSize()); |
| 4739 | 4769 |
| 4740 EXPECT_EQ(SpdyFramer::SPDY_RESET, framer.state()); | 4770 EXPECT_EQ(SpdyFramer::SPDY_RESET, framer.state()); |
| 4741 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code()) | 4771 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code()) |
| 4742 << SpdyFramer::ErrorCodeToString(framer.error_code()); | 4772 << SpdyFramer::ErrorCodeToString(framer.error_code()); |
| 4743 } | 4773 } |
| 4744 | 4774 |
| 4745 } // namespace net | 4775 } // namespace net |
| OLD | NEW |