| 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 |