| 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 "net/spdy/spdy_framer.h" | 5 #include "net/spdy/spdy_framer.h" |
| 6 | 6 |
| 7 #include <stdlib.h> | 7 #include <stdlib.h> |
| 8 #include <string.h> | 8 #include <string.h> |
| 9 | 9 |
| 10 #include <algorithm> | 10 #include <algorithm> |
| 11 #include <limits> | 11 #include <limits> |
| 12 #include <memory> | 12 #include <memory> |
| 13 #include <string> | 13 #include <string> |
| 14 #include <vector> | 14 #include <vector> |
| 15 | 15 |
| 16 #include "base/compiler_specific.h" | 16 #include "base/compiler_specific.h" |
| 17 #include "base/memory/scoped_ptr.h" | 17 #include "base/memory/scoped_ptr.h" |
| 18 #include "net/spdy/hpack/hpack_constants.h" | 18 #include "net/spdy/hpack/hpack_constants.h" |
| 19 #include "net/spdy/mock_spdy_framer_visitor.h" | 19 #include "net/spdy/mock_spdy_framer_visitor.h" |
| 20 #include "net/spdy/spdy_frame_builder.h" | 20 #include "net/spdy/spdy_frame_builder.h" |
| 21 #include "net/spdy/spdy_frame_reader.h" | 21 #include "net/spdy/spdy_frame_reader.h" |
| 22 #include "net/spdy/spdy_protocol.h" | 22 #include "net/spdy/spdy_protocol.h" |
| 23 #include "net/spdy/spdy_test_utils.h" | 23 #include "net/spdy/spdy_test_utils.h" |
| 24 #include "testing/gmock/include/gmock/gmock.h" | 24 #include "testing/gmock/include/gmock/gmock.h" |
| 25 #include "testing/platform_test.h" | 25 #include "testing/platform_test.h" |
| 26 | 26 |
| 27 using base::StringPiece; |
| 27 using std::string; | 28 using std::string; |
| 28 using testing::_; | 29 using testing::_; |
| 29 | 30 |
| 30 namespace net { | 31 namespace net { |
| 31 | 32 |
| 32 namespace test { | 33 namespace test { |
| 33 | 34 |
| 34 static const size_t kMaxDecompressedSize = 1024; | 35 static const size_t kMaxDecompressedSize = 1024; |
| 35 | 36 |
| 36 class MockDebugVisitor : public SpdyFramerDebugVisitorInterface { | 37 class MockDebugVisitor : public SpdyFramerDebugVisitorInterface { |
| (...skipping 567 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 604 static size_t ControlFrameBufferSize() { | 605 static size_t ControlFrameBufferSize() { |
| 605 return SpdyFramer::kControlFrameBufferSize; | 606 return SpdyFramer::kControlFrameBufferSize; |
| 606 } | 607 } |
| 607 static size_t GetNumberRequiredContinuationFrames(SpdyFramer* framer, | 608 static size_t GetNumberRequiredContinuationFrames(SpdyFramer* framer, |
| 608 size_t size) { | 609 size_t size) { |
| 609 return framer->GetNumberRequiredContinuationFrames(size); | 610 return framer->GetNumberRequiredContinuationFrames(size); |
| 610 } | 611 } |
| 611 }; | 612 }; |
| 612 | 613 |
| 613 // Retrieves serialized headers from a HEADERS or SYN_STREAM frame. | 614 // Retrieves serialized headers from a HEADERS or SYN_STREAM frame. |
| 614 base::StringPiece GetSerializedHeaders(const SpdyFrame* frame, | 615 StringPiece GetSerializedHeaders(const SpdyFrame* frame, |
| 615 const SpdyFramer& framer) { | 616 const SpdyFramer& framer) { |
| 616 SpdyFrameReader reader(frame->data(), frame->size()); | 617 SpdyFrameReader reader(frame->data(), frame->size()); |
| 617 if (framer.protocol_version() > SPDY3) { | 618 if (framer.protocol_version() > SPDY3) { |
| 618 reader.Seek(3); // Seek past the frame length. | 619 reader.Seek(3); // Seek past the frame length. |
| 619 } else { | 620 } else { |
| 620 reader.Seek(2); // Seek past the frame length. | 621 reader.Seek(2); // Seek past the frame length. |
| 621 } | 622 } |
| 622 SpdyFrameType frame_type; | 623 SpdyFrameType frame_type; |
| 623 if (framer.protocol_version() > SPDY3) { | 624 if (framer.protocol_version() > SPDY3) { |
| 624 uint8 serialized_type; | 625 uint8 serialized_type; |
| 625 reader.ReadUInt8(&serialized_type); | 626 reader.ReadUInt8(&serialized_type); |
| (...skipping 298 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 924 frame.WriteStringPiece32("value1"); | 925 frame.WriteStringPiece32("value1"); |
| 925 frame.WriteStringPiece32("name"); | 926 frame.WriteStringPiece32("name"); |
| 926 frame.WriteStringPiece32("value2"); | 927 frame.WriteStringPiece32("value2"); |
| 927 } | 928 } |
| 928 // write the length | 929 // write the length |
| 929 frame.RewriteLength(framer); | 930 frame.RewriteLength(framer); |
| 930 | 931 |
| 931 SpdyHeaderBlock new_headers; | 932 SpdyHeaderBlock new_headers; |
| 932 framer.set_enable_compression(false); | 933 framer.set_enable_compression(false); |
| 933 scoped_ptr<SpdyFrame> control_frame(frame.take()); | 934 scoped_ptr<SpdyFrame> control_frame(frame.take()); |
| 934 base::StringPiece serialized_headers = | 935 StringPiece serialized_headers = |
| 935 GetSerializedHeaders(control_frame.get(), framer); | 936 GetSerializedHeaders(control_frame.get(), framer); |
| 936 // This should fail because duplicate headers are verboten by the spec. | 937 // This should fail because duplicate headers are verboten by the spec. |
| 937 EXPECT_FALSE(framer.ParseHeaderBlockInBuffer(serialized_headers.data(), | 938 EXPECT_FALSE(framer.ParseHeaderBlockInBuffer(serialized_headers.data(), |
| 938 serialized_headers.size(), | 939 serialized_headers.size(), |
| 939 &new_headers)); | 940 &new_headers)); |
| 940 } | 941 } |
| 941 | 942 |
| 942 TEST_P(SpdyFramerTest, MultiValueHeader) { | 943 TEST_P(SpdyFramerTest, MultiValueHeader) { |
| 943 SpdyFramer framer(spdy_version_); | 944 SpdyFramer framer(spdy_version_); |
| 944 // Frame builder with plentiful buffer size. | 945 // Frame builder with plentiful buffer size. |
| (...skipping 324 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1269 } | 1270 } |
| 1270 | 1271 |
| 1271 EXPECT_EQ(0, visitor.syn_reply_frame_count_); | 1272 EXPECT_EQ(0, visitor.syn_reply_frame_count_); |
| 1272 EXPECT_EQ(24, visitor.data_bytes_); | 1273 EXPECT_EQ(24, visitor.data_bytes_); |
| 1273 EXPECT_EQ(0, visitor.error_count_); | 1274 EXPECT_EQ(0, visitor.error_count_); |
| 1274 EXPECT_EQ(2, visitor.fin_frame_count_); | 1275 EXPECT_EQ(2, visitor.fin_frame_count_); |
| 1275 | 1276 |
| 1276 if (IsHttp2()) { | 1277 if (IsHttp2()) { |
| 1277 EXPECT_EQ(3, visitor.headers_frame_count_); | 1278 EXPECT_EQ(3, visitor.headers_frame_count_); |
| 1278 EXPECT_EQ(0, visitor.syn_frame_count_); | 1279 EXPECT_EQ(0, visitor.syn_frame_count_); |
| 1279 base::StringPiece reset_stream = "RESETSTREAM"; | 1280 StringPiece reset_stream = "RESETSTREAM"; |
| 1280 EXPECT_EQ(reset_stream, visitor.fin_opaque_data_); | 1281 EXPECT_EQ(reset_stream, visitor.fin_opaque_data_); |
| 1281 } else { | 1282 } else { |
| 1282 EXPECT_EQ(1, visitor.headers_frame_count_); | 1283 EXPECT_EQ(1, visitor.headers_frame_count_); |
| 1283 EXPECT_EQ(2, visitor.syn_frame_count_); | 1284 EXPECT_EQ(2, visitor.syn_frame_count_); |
| 1284 EXPECT_TRUE(visitor.fin_opaque_data_.empty()); | 1285 EXPECT_TRUE(visitor.fin_opaque_data_.empty()); |
| 1285 } | 1286 } |
| 1286 | 1287 |
| 1287 EXPECT_EQ(0, visitor.fin_flag_count_); | 1288 EXPECT_EQ(0, visitor.fin_flag_count_); |
| 1288 EXPECT_EQ(0, visitor.zero_length_data_frame_count_); | 1289 EXPECT_EQ(0, visitor.zero_length_data_frame_count_); |
| 1289 EXPECT_EQ(4, visitor.data_frame_count_); | 1290 EXPECT_EQ(4, visitor.data_frame_count_); |
| (...skipping 219 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1509 // SYN_STREAM #2 | 1510 // SYN_STREAM #2 |
| 1510 block[kHeader3] = kValue3; | 1511 block[kHeader3] = kValue3; |
| 1511 SpdySynStreamIR syn_stream(3); | 1512 SpdySynStreamIR syn_stream(3); |
| 1512 syn_stream.set_header_block(block); | 1513 syn_stream.set_header_block(block); |
| 1513 scoped_ptr<SpdyFrame> syn_frame_2(send_framer.SerializeSynStream(syn_stream)); | 1514 scoped_ptr<SpdyFrame> syn_frame_2(send_framer.SerializeSynStream(syn_stream)); |
| 1514 EXPECT_TRUE(syn_frame_2.get() != NULL); | 1515 EXPECT_TRUE(syn_frame_2.get() != NULL); |
| 1515 | 1516 |
| 1516 // Now start decompressing | 1517 // Now start decompressing |
| 1517 scoped_ptr<SpdyFrame> decompressed; | 1518 scoped_ptr<SpdyFrame> decompressed; |
| 1518 scoped_ptr<SpdyFrame> uncompressed; | 1519 scoped_ptr<SpdyFrame> uncompressed; |
| 1519 base::StringPiece serialized_headers; | 1520 StringPiece serialized_headers; |
| 1520 SpdyHeaderBlock decompressed_headers; | 1521 SpdyHeaderBlock decompressed_headers; |
| 1521 | 1522 |
| 1522 // Decompress SYN_STREAM #1 | 1523 // Decompress SYN_STREAM #1 |
| 1523 decompressed.reset( | 1524 decompressed.reset( |
| 1524 SpdyFramerTestUtil::DecompressFrame(&recv_framer, *syn_frame_1)); | 1525 SpdyFramerTestUtil::DecompressFrame(&recv_framer, *syn_frame_1)); |
| 1525 EXPECT_TRUE(decompressed.get() != NULL); | 1526 EXPECT_TRUE(decompressed.get() != NULL); |
| 1526 serialized_headers = GetSerializedHeaders(decompressed.get(), send_framer); | 1527 serialized_headers = GetSerializedHeaders(decompressed.get(), send_framer); |
| 1527 EXPECT_TRUE(recv_framer.ParseHeaderBlockInBuffer(serialized_headers.data(), | 1528 EXPECT_TRUE(recv_framer.ParseHeaderBlockInBuffer(serialized_headers.data(), |
| 1528 serialized_headers.size(), | 1529 serialized_headers.size(), |
| 1529 &decompressed_headers)); | 1530 &decompressed_headers)); |
| (...skipping 4603 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6133 | 6134 |
| 6134 EXPECT_EQ(1, visitor->data_frame_count_); | 6135 EXPECT_EQ(1, visitor->data_frame_count_); |
| 6135 EXPECT_EQ(strlen(four_score), static_cast<unsigned>(visitor->data_bytes_)); | 6136 EXPECT_EQ(strlen(four_score), static_cast<unsigned>(visitor->data_bytes_)); |
| 6136 EXPECT_EQ(0, visitor->headers_frame_count_); | 6137 EXPECT_EQ(0, visitor->headers_frame_count_); |
| 6137 } | 6138 } |
| 6138 } | 6139 } |
| 6139 | 6140 |
| 6140 } // namespace test | 6141 } // namespace test |
| 6141 | 6142 |
| 6142 } // namespace net | 6143 } // namespace net |
| OLD | NEW |