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 |