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 |