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> |
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
85 SpdyHeadersHandlerInterface* OnHeaderFrameStart( | 85 SpdyHeadersHandlerInterface* OnHeaderFrameStart( |
86 SpdyStreamId stream_id) override { | 86 SpdyStreamId stream_id) override { |
87 if (headers_handler_ == nullptr) { | 87 if (headers_handler_ == nullptr) { |
88 headers_handler_.reset(new TestHeadersHandler); | 88 headers_handler_.reset(new TestHeadersHandler); |
89 } | 89 } |
90 return headers_handler_.get(); | 90 return headers_handler_.get(); |
91 } | 91 } |
92 | 92 |
93 void OnHeaderFrameEnd(SpdyStreamId stream_id, bool end_headers) override { | 93 void OnHeaderFrameEnd(SpdyStreamId stream_id, bool end_headers) override { |
94 CHECK(!finished_); | 94 CHECK(!finished_); |
95 frame_->set_header_block(headers_handler_->decoded_block()); | 95 frame_->set_header_block(headers_handler_->decoded_block().Clone()); |
96 finished_ = true; | 96 finished_ = true; |
97 if (end_headers) { | 97 if (end_headers) { |
98 headers_handler_.reset(); | 98 headers_handler_.reset(); |
99 } | 99 } |
100 } | 100 } |
101 | 101 |
102 void OnSynStream(SpdyStreamId stream_id, | 102 void OnSynStream(SpdyStreamId stream_id, |
103 SpdyStreamId associated_stream_id, | 103 SpdyStreamId associated_stream_id, |
104 SpdyPriority priority, | 104 SpdyPriority priority, |
105 bool fin, | 105 bool fin, |
(...skipping 381 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
487 SpdyHeadersHandlerInterface* OnHeaderFrameStart( | 487 SpdyHeadersHandlerInterface* OnHeaderFrameStart( |
488 SpdyStreamId stream_id) override { | 488 SpdyStreamId stream_id) override { |
489 if (headers_handler_ == nullptr) { | 489 if (headers_handler_ == nullptr) { |
490 headers_handler_.reset(new TestHeadersHandler); | 490 headers_handler_.reset(new TestHeadersHandler); |
491 } | 491 } |
492 return headers_handler_.get(); | 492 return headers_handler_.get(); |
493 } | 493 } |
494 | 494 |
495 void OnHeaderFrameEnd(SpdyStreamId stream_id, bool end_headers) override { | 495 void OnHeaderFrameEnd(SpdyStreamId stream_id, bool end_headers) override { |
496 CHECK(headers_handler_ != nullptr); | 496 CHECK(headers_handler_ != nullptr); |
497 headers_ = headers_handler_->decoded_block(); | 497 headers_ = headers_handler_->decoded_block().Clone(); |
498 header_bytes_received_ = headers_handler_->header_bytes_parsed(); | 498 header_bytes_received_ = headers_handler_->header_bytes_parsed(); |
499 if (end_headers) { | 499 if (end_headers) { |
500 headers_handler_.reset(); | 500 headers_handler_.reset(); |
501 } | 501 } |
502 } | 502 } |
503 | 503 |
504 bool OnControlFrameHeaderData(SpdyStreamId stream_id, | 504 bool OnControlFrameHeaderData(SpdyStreamId stream_id, |
505 const char* header_data, | 505 const char* header_data, |
506 size_t len) override { | 506 size_t len) override { |
507 VLOG(1) << "OnControlFrameHeaderData(" << stream_id << ", data, " << len | 507 VLOG(1) << "OnControlFrameHeaderData(" << stream_id << ", data, " << len |
(...skipping 1443 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1951 const char kHeader2[] = "header2"; | 1951 const char kHeader2[] = "header2"; |
1952 const char kHeader3[] = "header3"; | 1952 const char kHeader3[] = "header3"; |
1953 const char kValue1[] = "value1"; | 1953 const char kValue1[] = "value1"; |
1954 const char kValue2[] = "value2"; | 1954 const char kValue2[] = "value2"; |
1955 const char kValue3[] = "value3"; | 1955 const char kValue3[] = "value3"; |
1956 | 1956 |
1957 // SYN_STREAM #1 | 1957 // SYN_STREAM #1 |
1958 SpdyHeaderBlock block; | 1958 SpdyHeaderBlock block; |
1959 block[kHeader1] = kValue1; | 1959 block[kHeader1] = kValue1; |
1960 block[kHeader2] = kValue2; | 1960 block[kHeader2] = kValue2; |
1961 SpdySynStreamIR syn_ir_1(1, block); | 1961 SpdySynStreamIR syn_ir_1(1, block.Clone()); |
1962 SpdySerializedFrame syn_frame_1(send_framer.SerializeFrame(syn_ir_1)); | 1962 SpdySerializedFrame syn_frame_1(send_framer.SerializeFrame(syn_ir_1)); |
1963 | 1963 |
1964 // SYN_STREAM #2 | 1964 // SYN_STREAM #2 |
1965 block[kHeader3] = kValue3; | 1965 block[kHeader3] = kValue3; |
1966 SpdySynStreamIR syn_stream(3, std::move(block)); | 1966 SpdySynStreamIR syn_stream(3, std::move(block)); |
1967 SpdySerializedFrame syn_frame_2(send_framer.SerializeSynStream(syn_stream)); | 1967 SpdySerializedFrame syn_frame_2(send_framer.SerializeSynStream(syn_stream)); |
1968 | 1968 |
1969 // Decompress SYN_STREAM #1 | 1969 // Decompress SYN_STREAM #1 |
1970 SpdySerializedFrame decompressed( | 1970 SpdySerializedFrame decompressed( |
1971 SpdyFramerTestUtil::DecompressFrame(&recv_framer, syn_frame_1)); | 1971 SpdyFramerTestUtil::DecompressFrame(&recv_framer, syn_frame_1)); |
(...skipping 1990 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3962 TEST_P(SpdyFramerTest, ReadCompressedSynStreamHeaderBlock) { | 3962 TEST_P(SpdyFramerTest, ReadCompressedSynStreamHeaderBlock) { |
3963 if (!IsSpdy3()) { | 3963 if (!IsSpdy3()) { |
3964 return; | 3964 return; |
3965 } | 3965 } |
3966 | 3966 |
3967 SpdyFramer framer(spdy_version_); | 3967 SpdyFramer framer(spdy_version_); |
3968 SpdySynStreamIR syn_stream(1); | 3968 SpdySynStreamIR syn_stream(1); |
3969 syn_stream.set_priority(1); | 3969 syn_stream.set_priority(1); |
3970 syn_stream.SetHeader("aa", "vv"); | 3970 syn_stream.SetHeader("aa", "vv"); |
3971 syn_stream.SetHeader("bb", "ww"); | 3971 syn_stream.SetHeader("bb", "ww"); |
3972 SpdyHeaderBlock headers = syn_stream.header_block(); | |
3973 SpdySerializedFrame control_frame(framer.SerializeSynStream(syn_stream)); | 3972 SpdySerializedFrame control_frame(framer.SerializeSynStream(syn_stream)); |
3974 TestSpdyVisitor visitor(spdy_version_); | 3973 TestSpdyVisitor visitor(spdy_version_); |
3975 visitor.use_compression_ = true; | 3974 visitor.use_compression_ = true; |
3976 visitor.SimulateInFramer( | 3975 visitor.SimulateInFramer( |
3977 reinterpret_cast<unsigned char*>(control_frame.data()), | 3976 reinterpret_cast<unsigned char*>(control_frame.data()), |
3978 control_frame.size()); | 3977 control_frame.size()); |
3979 EXPECT_EQ(1, visitor.syn_frame_count_); | 3978 EXPECT_EQ(1, visitor.syn_frame_count_); |
3980 EXPECT_EQ(headers, visitor.headers_); | 3979 EXPECT_EQ(syn_stream.header_block(), visitor.headers_); |
3981 } | 3980 } |
3982 | 3981 |
3983 TEST_P(SpdyFramerTest, ReadCompressedSynReplyHeaderBlock) { | 3982 TEST_P(SpdyFramerTest, ReadCompressedSynReplyHeaderBlock) { |
3984 if (!IsSpdy3()) { | 3983 if (!IsSpdy3()) { |
3985 return; | 3984 return; |
3986 } | 3985 } |
3987 | 3986 |
3988 SpdyFramer framer(spdy_version_); | 3987 SpdyFramer framer(spdy_version_); |
3989 SpdySynReplyIR syn_reply(1); | 3988 SpdySynReplyIR syn_reply(1); |
3990 syn_reply.SetHeader("alpha", "beta"); | 3989 syn_reply.SetHeader("alpha", "beta"); |
3991 syn_reply.SetHeader("gamma", "delta"); | 3990 syn_reply.SetHeader("gamma", "delta"); |
3992 SpdyHeaderBlock headers = syn_reply.header_block(); | |
3993 SpdySerializedFrame control_frame(framer.SerializeSynReply(syn_reply)); | 3991 SpdySerializedFrame control_frame(framer.SerializeSynReply(syn_reply)); |
3994 TestSpdyVisitor visitor(spdy_version_); | 3992 TestSpdyVisitor visitor(spdy_version_); |
3995 visitor.use_compression_ = true; | 3993 visitor.use_compression_ = true; |
3996 visitor.SimulateInFramer( | 3994 visitor.SimulateInFramer( |
3997 reinterpret_cast<unsigned char*>(control_frame.data()), | 3995 reinterpret_cast<unsigned char*>(control_frame.data()), |
3998 control_frame.size()); | 3996 control_frame.size()); |
3999 EXPECT_EQ(1, visitor.syn_reply_frame_count_); | 3997 EXPECT_EQ(1, visitor.syn_reply_frame_count_); |
4000 EXPECT_EQ(0, visitor.headers_frame_count_); | 3998 EXPECT_EQ(0, visitor.headers_frame_count_); |
4001 EXPECT_EQ(headers, visitor.headers_); | 3999 EXPECT_EQ(syn_reply.header_block(), visitor.headers_); |
4002 } | 4000 } |
4003 | 4001 |
4004 TEST_P(SpdyFramerTest, ReadCompressedHeadersHeaderBlock) { | 4002 TEST_P(SpdyFramerTest, ReadCompressedHeadersHeaderBlock) { |
4005 SpdyFramer framer(spdy_version_); | 4003 SpdyFramer framer(spdy_version_); |
4006 SpdyHeadersIR headers_ir(1); | 4004 SpdyHeadersIR headers_ir(1); |
4007 headers_ir.SetHeader("alpha", "beta"); | 4005 headers_ir.SetHeader("alpha", "beta"); |
4008 headers_ir.SetHeader("gamma", "delta"); | 4006 headers_ir.SetHeader("gamma", "delta"); |
4009 SpdyHeaderBlock headers = headers_ir.header_block(); | |
4010 SpdySerializedFrame control_frame(framer.SerializeHeaders(headers_ir)); | 4007 SpdySerializedFrame control_frame(framer.SerializeHeaders(headers_ir)); |
4011 TestSpdyVisitor visitor(spdy_version_); | 4008 TestSpdyVisitor visitor(spdy_version_); |
4012 visitor.use_compression_ = true; | 4009 visitor.use_compression_ = true; |
4013 visitor.SimulateInFramer( | 4010 visitor.SimulateInFramer( |
4014 reinterpret_cast<unsigned char*>(control_frame.data()), | 4011 reinterpret_cast<unsigned char*>(control_frame.data()), |
4015 control_frame.size()); | 4012 control_frame.size()); |
4016 EXPECT_EQ(1, visitor.headers_frame_count_); | 4013 EXPECT_EQ(1, visitor.headers_frame_count_); |
4017 EXPECT_EQ(0, visitor.control_frame_header_data_count_); | 4014 EXPECT_EQ(0, visitor.control_frame_header_data_count_); |
4018 EXPECT_EQ(0, visitor.zero_length_control_frame_header_data_count_); | 4015 EXPECT_EQ(0, visitor.zero_length_control_frame_header_data_count_); |
4019 EXPECT_EQ(0, visitor.end_of_stream_count_); | 4016 EXPECT_EQ(0, visitor.end_of_stream_count_); |
4020 EXPECT_EQ(headers, visitor.headers_); | 4017 EXPECT_EQ(headers_ir.header_block(), visitor.headers_); |
4021 } | 4018 } |
4022 | 4019 |
4023 TEST_P(SpdyFramerTest, ReadCompressedHeadersHeaderBlockWithHalfClose) { | 4020 TEST_P(SpdyFramerTest, ReadCompressedHeadersHeaderBlockWithHalfClose) { |
4024 SpdyFramer framer(spdy_version_); | 4021 SpdyFramer framer(spdy_version_); |
4025 SpdyHeadersIR headers_ir(1); | 4022 SpdyHeadersIR headers_ir(1); |
4026 headers_ir.set_fin(true); | 4023 headers_ir.set_fin(true); |
4027 headers_ir.SetHeader("alpha", "beta"); | 4024 headers_ir.SetHeader("alpha", "beta"); |
4028 headers_ir.SetHeader("gamma", "delta"); | 4025 headers_ir.SetHeader("gamma", "delta"); |
4029 SpdyHeaderBlock headers = headers_ir.header_block(); | |
4030 SpdySerializedFrame control_frame(framer.SerializeHeaders(headers_ir)); | 4026 SpdySerializedFrame control_frame(framer.SerializeHeaders(headers_ir)); |
4031 TestSpdyVisitor visitor(spdy_version_); | 4027 TestSpdyVisitor visitor(spdy_version_); |
4032 visitor.use_compression_ = true; | 4028 visitor.use_compression_ = true; |
4033 visitor.SimulateInFramer( | 4029 visitor.SimulateInFramer( |
4034 reinterpret_cast<unsigned char*>(control_frame.data()), | 4030 reinterpret_cast<unsigned char*>(control_frame.data()), |
4035 control_frame.size()); | 4031 control_frame.size()); |
4036 EXPECT_EQ(1, visitor.headers_frame_count_); | 4032 EXPECT_EQ(1, visitor.headers_frame_count_); |
4037 EXPECT_EQ(0, visitor.control_frame_header_data_count_); | 4033 EXPECT_EQ(0, visitor.control_frame_header_data_count_); |
4038 EXPECT_EQ(0, visitor.zero_length_control_frame_header_data_count_); | 4034 EXPECT_EQ(0, visitor.zero_length_control_frame_header_data_count_); |
4039 EXPECT_EQ(1, visitor.end_of_stream_count_); | 4035 EXPECT_EQ(1, visitor.end_of_stream_count_); |
4040 EXPECT_EQ(headers, visitor.headers_); | 4036 EXPECT_EQ(headers_ir.header_block(), visitor.headers_); |
4041 } | 4037 } |
4042 | 4038 |
4043 TEST_P(SpdyFramerTest, ControlFrameAtMaxSizeLimit) { | 4039 TEST_P(SpdyFramerTest, ControlFrameAtMaxSizeLimit) { |
4044 if (!IsSpdy3()) { | 4040 if (!IsSpdy3()) { |
4045 // TODO(jgraettinger): This test setup doesn't work with HPACK. | 4041 // TODO(jgraettinger): This test setup doesn't work with HPACK. |
4046 return; | 4042 return; |
4047 } | 4043 } |
4048 | 4044 |
4049 // First find the size of the header value in order to just reach the control | 4045 // First find the size of the header value in order to just reach the control |
4050 // frame max size. | 4046 // frame max size. |
(...skipping 562 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4613 | 4609 |
4614 TEST_P(SpdyFramerTest, ReadCompressedPushPromise) { | 4610 TEST_P(SpdyFramerTest, ReadCompressedPushPromise) { |
4615 if (!IsHttp2()) { | 4611 if (!IsHttp2()) { |
4616 return; | 4612 return; |
4617 } | 4613 } |
4618 | 4614 |
4619 SpdyFramer framer(spdy_version_); | 4615 SpdyFramer framer(spdy_version_); |
4620 SpdyPushPromiseIR push_promise(42, 57); | 4616 SpdyPushPromiseIR push_promise(42, 57); |
4621 push_promise.SetHeader("foo", "bar"); | 4617 push_promise.SetHeader("foo", "bar"); |
4622 push_promise.SetHeader("bar", "foofoo"); | 4618 push_promise.SetHeader("bar", "foofoo"); |
4623 SpdyHeaderBlock headers = push_promise.header_block(); | |
4624 SpdySerializedFrame frame(framer.SerializePushPromise(push_promise)); | 4619 SpdySerializedFrame frame(framer.SerializePushPromise(push_promise)); |
4625 TestSpdyVisitor visitor(spdy_version_); | 4620 TestSpdyVisitor visitor(spdy_version_); |
4626 visitor.use_compression_ = true; | 4621 visitor.use_compression_ = true; |
4627 visitor.SimulateInFramer(reinterpret_cast<unsigned char*>(frame.data()), | 4622 visitor.SimulateInFramer(reinterpret_cast<unsigned char*>(frame.data()), |
4628 frame.size()); | 4623 frame.size()); |
4629 EXPECT_EQ(42u, visitor.last_push_promise_stream_); | 4624 EXPECT_EQ(42u, visitor.last_push_promise_stream_); |
4630 EXPECT_EQ(57u, visitor.last_push_promise_promised_stream_); | 4625 EXPECT_EQ(57u, visitor.last_push_promise_promised_stream_); |
4631 EXPECT_EQ(headers, visitor.headers_); | 4626 EXPECT_EQ(push_promise.header_block(), visitor.headers_); |
4632 } | 4627 } |
4633 | 4628 |
4634 TEST_P(SpdyFramerTest, ReadHeadersWithContinuation) { | 4629 TEST_P(SpdyFramerTest, ReadHeadersWithContinuation) { |
4635 if (!IsHttp2()) { | 4630 if (!IsHttp2()) { |
4636 return; | 4631 return; |
4637 } | 4632 } |
4638 | 4633 |
4639 // frame-format off | 4634 // frame-format off |
4640 const unsigned char kInput[] = { | 4635 const unsigned char kInput[] = { |
4641 0x00, 0x00, 0x14, // Length: 20 | 4636 0x00, 0x00, 0x14, // Length: 20 |
(...skipping 1713 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6355 | 6350 |
6356 EXPECT_EQ(1, visitor->data_frame_count_); | 6351 EXPECT_EQ(1, visitor->data_frame_count_); |
6357 EXPECT_EQ(strlen(four_score), static_cast<unsigned>(visitor->data_bytes_)); | 6352 EXPECT_EQ(strlen(four_score), static_cast<unsigned>(visitor->data_bytes_)); |
6358 EXPECT_EQ(0, visitor->headers_frame_count_); | 6353 EXPECT_EQ(0, visitor->headers_frame_count_); |
6359 } | 6354 } |
6360 } | 6355 } |
6361 | 6356 |
6362 } // namespace test | 6357 } // namespace test |
6363 | 6358 |
6364 } // namespace net | 6359 } // namespace net |
OLD | NEW |