diff options
author | baranovich@yandex-team.ru <baranovich@yandex-team.ru@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-05-30 05:24:18 +0000 |
---|---|---|
committer | baranovich@yandex-team.ru <baranovich@yandex-team.ru@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-05-30 05:24:18 +0000 |
commit | c119036841f420a385e893a4316a55fbd511e442 (patch) | |
tree | 696e414e415dd24344e90d3376323c27202e4d69 /net | |
parent | 53ec557e6e24a6d54deedff335083644fb5b608e (diff) | |
download | chromium_src-c119036841f420a385e893a4316a55fbd511e442.zip chromium_src-c119036841f420a385e893a4316a55fbd511e442.tar.gz chromium_src-c119036841f420a385e893a4316a55fbd511e442.tar.bz2 |
Add headers argument to
BufferedSpdyFramerVisitorInterface::OnPushPromise
BUG=377538
R=jgraettinger@chromium.org
TEST=BufferedSpdyFramerTest.ReadPushPromiseHeaderBlock
Review URL: https://codereview.chromium.org/300553013
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@273722 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'net')
-rw-r--r-- | net/spdy/buffered_spdy_framer.cc | 27 | ||||
-rw-r--r-- | net/spdy/buffered_spdy_framer.h | 7 | ||||
-rw-r--r-- | net/spdy/buffered_spdy_framer_unittest.cc | 49 | ||||
-rw-r--r-- | net/spdy/spdy_session.cc | 3 | ||||
-rw-r--r-- | net/spdy/spdy_session.h | 3 | ||||
-rw-r--r-- | net/spdy/spdy_test_util_common.cc | 11 | ||||
-rw-r--r-- | net/tools/flip_server/spdy_interface.h | 3 | ||||
-rw-r--r-- | net/tools/flip_server/spdy_interface_test.cc | 3 |
8 files changed, 91 insertions, 15 deletions
diff --git a/net/spdy/buffered_spdy_framer.cc b/net/spdy/buffered_spdy_framer.cc index 825d9c5..5b95be2 100644 --- a/net/spdy/buffered_spdy_framer.cc +++ b/net/spdy/buffered_spdy_framer.cc @@ -139,6 +139,12 @@ bool BufferedSpdyFramer::OnControlFrameHeaderData(SpdyStreamId stream_id, control_frame_fields_->fin, headers); break; + case PUSH_PROMISE: + DCHECK_LT(SPDY3, protocol_version()); + visitor_->OnPushPromise(control_frame_fields_->stream_id, + control_frame_fields_->promised_stream_id, + headers); + break; default: DCHECK(false) << "Unexpect control frame type: " << control_frame_fields_->type; @@ -214,8 +220,15 @@ void BufferedSpdyFramer::OnWindowUpdate(SpdyStreamId stream_id, void BufferedSpdyFramer::OnPushPromise(SpdyStreamId stream_id, SpdyStreamId promised_stream_id, bool end) { - // TODO(jgraettinger): Deliver headers, similar to OnHeaders. - visitor_->OnPushPromise(stream_id, promised_stream_id); + DCHECK_LT(SPDY3, protocol_version()); + frames_received_++; + DCHECK(!control_frame_fields_.get()); + control_frame_fields_.reset(new ControlFrameFields()); + control_frame_fields_->type = PUSH_PROMISE; + control_frame_fields_->stream_id = stream_id; + control_frame_fields_->promised_stream_id = promised_stream_id; + + InitHeaderStreaming(stream_id); } void BufferedSpdyFramer::OnContinuation(SpdyStreamId stream_id, bool end) { @@ -353,6 +366,16 @@ SpdyFrame* BufferedSpdyFramer::CreateDataFrame(SpdyStreamId stream_id, return spdy_framer_.SerializeData(data_ir); } +// TODO(jgraettinger): Eliminate uses of this method (prefer SpdyPushPromiseIR). +SpdyFrame* BufferedSpdyFramer::CreatePushPromise( + SpdyStreamId stream_id, + SpdyStreamId promised_stream_id, + const SpdyHeaderBlock* headers) { + SpdyPushPromiseIR push_promise_ir(stream_id, promised_stream_id); + push_promise_ir.set_name_value_block(*headers); + return spdy_framer_.SerializePushPromise(push_promise_ir); +} + SpdyPriority BufferedSpdyFramer::GetHighestPriority() const { return spdy_framer_.GetHighestPriority(); } diff --git a/net/spdy/buffered_spdy_framer.h b/net/spdy/buffered_spdy_framer.h index a77de75..64aa0f7 100644 --- a/net/spdy/buffered_spdy_framer.h +++ b/net/spdy/buffered_spdy_framer.h @@ -100,7 +100,8 @@ class NET_EXPORT_PRIVATE BufferedSpdyFramerVisitorInterface { // Called when a PUSH_PROMISE frame has been parsed. virtual void OnPushPromise(SpdyStreamId stream_id, - SpdyStreamId promised_stream_id) = 0; + SpdyStreamId promised_stream_id, + const SpdyHeaderBlock& headers) = 0; protected: virtual ~BufferedSpdyFramerVisitorInterface() {} @@ -196,6 +197,9 @@ class NET_EXPORT_PRIVATE BufferedSpdyFramer const char* data, uint32 len, SpdyDataFlags flags); + SpdyFrame* CreatePushPromise(SpdyStreamId stream_id, + SpdyStreamId promised_stream_id, + const SpdyHeaderBlock* headers); // Serialize a frame of unknown type. SpdySerializedFrame* SerializeFrame(const SpdyFrameIR& frame) { @@ -252,6 +256,7 @@ class NET_EXPORT_PRIVATE BufferedSpdyFramer SpdyFrameType type; SpdyStreamId stream_id; SpdyStreamId associated_stream_id; + SpdyStreamId promised_stream_id; SpdyPriority priority; uint8 credential_slot; bool fin; diff --git a/net/spdy/buffered_spdy_framer_unittest.cc b/net/spdy/buffered_spdy_framer_unittest.cc index 0f7bf31..30abe96 100644 --- a/net/spdy/buffered_spdy_framer_unittest.cc +++ b/net/spdy/buffered_spdy_framer_unittest.cc @@ -20,7 +20,9 @@ class TestBufferedSpdyVisitor : public BufferedSpdyFramerVisitorInterface { syn_frame_count_(0), syn_reply_frame_count_(0), headers_frame_count_(0), - header_stream_id_(-1) { + push_promise_frame_count_(0), + header_stream_id_(-1), + promised_stream_id_(-1) { } virtual void OnError(SpdyFramer::SpdyError error_code) OVERRIDE { @@ -111,8 +113,18 @@ class TestBufferedSpdyVisitor : public BufferedSpdyFramerVisitorInterface { void OnPing(const SpdyFrame& frame) {} virtual void OnWindowUpdate(SpdyStreamId stream_id, uint32 delta_window_size) OVERRIDE {} + virtual void OnPushPromise(SpdyStreamId stream_id, - SpdyStreamId promised_stream_id) OVERRIDE {} + SpdyStreamId promised_stream_id, + const SpdyHeaderBlock& headers) OVERRIDE { + header_stream_id_ = stream_id; + EXPECT_NE(header_stream_id_, SpdyFramer::kInvalidStream); + push_promise_frame_count_++; + promised_stream_id_ = promised_stream_id; + EXPECT_NE(promised_stream_id_, SpdyFramer::kInvalidStream); + headers_ = headers; + } + void OnCredential(const SpdyFrame& frame) {} // Convenience function which runs a framer simulation with particular input. @@ -143,11 +155,14 @@ class TestBufferedSpdyVisitor : public BufferedSpdyFramerVisitorInterface { int syn_frame_count_; int syn_reply_frame_count_; int headers_frame_count_; + int push_promise_frame_count_; // Header block streaming state: SpdyStreamId header_stream_id_; + SpdyStreamId promised_stream_id_; - // Headers from OnSyn, OnSynReply and OnHeaders for verification. + // Headers from OnSyn, OnSynReply, OnHeaders and OnPushPromise for + // verification. SpdyHeaderBlock headers_; }; @@ -231,6 +246,7 @@ TEST_P(BufferedSpdyFramerTest, ReadSynStreamHeaderBlock) { EXPECT_EQ(1, visitor.syn_frame_count_); EXPECT_EQ(0, visitor.syn_reply_frame_count_); EXPECT_EQ(0, visitor.headers_frame_count_); + EXPECT_EQ(0, visitor.push_promise_frame_count_); EXPECT_TRUE(CompareHeaderBlocks(&headers, &visitor.headers_)); } @@ -251,6 +267,7 @@ TEST_P(BufferedSpdyFramerTest, ReadSynReplyHeaderBlock) { control_frame.get()->size()); EXPECT_EQ(0, visitor.error_count_); EXPECT_EQ(0, visitor.syn_frame_count_); + EXPECT_EQ(0, visitor.push_promise_frame_count_); if(spdy_version() < SPDY4) { EXPECT_EQ(1, visitor.syn_reply_frame_count_); EXPECT_EQ(0, visitor.headers_frame_count_); @@ -280,7 +297,33 @@ TEST_P(BufferedSpdyFramerTest, ReadHeadersHeaderBlock) { EXPECT_EQ(0, visitor.syn_frame_count_); EXPECT_EQ(0, visitor.syn_reply_frame_count_); EXPECT_EQ(1, visitor.headers_frame_count_); + EXPECT_EQ(0, visitor.push_promise_frame_count_); + EXPECT_TRUE(CompareHeaderBlocks(&headers, &visitor.headers_)); +} + +TEST_P(BufferedSpdyFramerTest, ReadPushPromiseHeaderBlock) { + if (spdy_version() < SPDY4) + return; + SpdyHeaderBlock headers; + headers["alpha"] = "beta"; + headers["gamma"] = "delta"; + BufferedSpdyFramer framer(spdy_version(), true); + scoped_ptr<SpdyFrame> control_frame( + framer.CreatePushPromise(1, 2, &headers)); + EXPECT_TRUE(control_frame.get() != NULL); + + TestBufferedSpdyVisitor visitor(spdy_version()); + visitor.SimulateInFramer( + reinterpret_cast<unsigned char*>(control_frame.get()->data()), + control_frame.get()->size()); + EXPECT_EQ(0, visitor.error_count_); + EXPECT_EQ(0, visitor.syn_frame_count_); + EXPECT_EQ(0, visitor.syn_reply_frame_count_); + EXPECT_EQ(0, visitor.headers_frame_count_); + EXPECT_EQ(1, visitor.push_promise_frame_count_); EXPECT_TRUE(CompareHeaderBlocks(&headers, &visitor.headers_)); + EXPECT_EQ(1u, visitor.header_stream_id_); + EXPECT_EQ(2u, visitor.promised_stream_id_); } } // namespace net diff --git a/net/spdy/spdy_session.cc b/net/spdy/spdy_session.cc index f416cd6..fab1e0f 100644 --- a/net/spdy/spdy_session.cc +++ b/net/spdy/spdy_session.cc @@ -2415,7 +2415,8 @@ void SpdySession::OnWindowUpdate(SpdyStreamId stream_id, } void SpdySession::OnPushPromise(SpdyStreamId stream_id, - SpdyStreamId promised_stream_id) { + SpdyStreamId promised_stream_id, + const SpdyHeaderBlock& headers) { // TODO(akalin): Handle PUSH_PROMISE frames. } diff --git a/net/spdy/spdy_session.h b/net/spdy/spdy_session.h index 7baab56..7662b62 100644 --- a/net/spdy/spdy_session.h +++ b/net/spdy/spdy_session.h @@ -793,7 +793,8 @@ class NET_EXPORT SpdySession : public BufferedSpdyFramerVisitorInterface, virtual void OnWindowUpdate(SpdyStreamId stream_id, uint32 delta_window_size) OVERRIDE; virtual void OnPushPromise(SpdyStreamId stream_id, - SpdyStreamId promised_stream_id) OVERRIDE; + SpdyStreamId promised_stream_id, + const SpdyHeaderBlock& headers) OVERRIDE; virtual void OnSynStream(SpdyStreamId stream_id, SpdyStreamId associated_stream_id, SpdyPriority priority, diff --git a/net/spdy/spdy_test_util_common.cc b/net/spdy/spdy_test_util_common.cc index e73878c..4f44b9c 100644 --- a/net/spdy/spdy_test_util_common.cc +++ b/net/spdy/spdy_test_util_common.cc @@ -245,7 +245,8 @@ class PriorityGetter : public BufferedSpdyFramerVisitorInterface { virtual void OnWindowUpdate(SpdyStreamId stream_id, uint32 delta_window_size) OVERRIDE {} virtual void OnPushPromise(SpdyStreamId stream_id, - SpdyStreamId promised_stream_id) OVERRIDE {} + SpdyStreamId promised_stream_id, + const SpdyHeaderBlock& headers) OVERRIDE {} private: SpdyPriority priority_; @@ -357,8 +358,8 @@ SpdySessionDependencies::SpdySessionDependencies(NextProto protocol) protocol(protocol), stream_initial_recv_window_size(kSpdyStreamInitialWindowSize), time_func(&base::TimeTicks::Now), - force_spdy_over_ssl(false),
- force_spdy_always(false),
+ force_spdy_over_ssl(false), + force_spdy_always(false), use_alternate_protocols(false), net_log(NULL) { DCHECK(next_proto_is_spdy(protocol)) << "Invalid protocol: " << protocol; @@ -390,8 +391,8 @@ SpdySessionDependencies::SpdySessionDependencies( protocol(protocol), stream_initial_recv_window_size(kSpdyStreamInitialWindowSize), time_func(&base::TimeTicks::Now), - force_spdy_over_ssl(false),
- force_spdy_always(false),
+ force_spdy_over_ssl(false), + force_spdy_always(false), use_alternate_protocols(false), net_log(NULL) { DCHECK(next_proto_is_spdy(protocol)) << "Invalid protocol: " << protocol; diff --git a/net/tools/flip_server/spdy_interface.h b/net/tools/flip_server/spdy_interface.h index 5ab8cba..e472cf2a 100644 --- a/net/tools/flip_server/spdy_interface.h +++ b/net/tools/flip_server/spdy_interface.h @@ -127,7 +127,8 @@ class SpdySM : public BufferedSpdyFramerVisitorInterface, public SMInterface { // Called when a PUSH_PROMISE frame has been parsed. virtual void OnPushPromise(SpdyStreamId stream_id, - SpdyStreamId promised_stream_id) OVERRIDE {} + SpdyStreamId promised_stream_id, + const SpdyHeaderBlock& headers) OVERRIDE {} public: virtual size_t ProcessReadInput(const char* data, size_t len) OVERRIDE; diff --git a/net/tools/flip_server/spdy_interface_test.cc b/net/tools/flip_server/spdy_interface_test.cc index 8b340a8..7e2e524 100644 --- a/net/tools/flip_server/spdy_interface_test.cc +++ b/net/tools/flip_server/spdy_interface_test.cc @@ -64,7 +64,8 @@ class SpdyFramerVisitor : public BufferedSpdyFramerVisitorInterface { MOCK_METHOD2(OnRstStream, void(SpdyStreamId, SpdyRstStreamStatus)); MOCK_METHOD2(OnGoAway, void(SpdyStreamId, SpdyGoAwayStatus)); MOCK_METHOD2(OnWindowUpdate, void(SpdyStreamId, uint32)); - MOCK_METHOD2(OnPushPromise, void(SpdyStreamId, SpdyStreamId)); + MOCK_METHOD3(OnPushPromise, + void(SpdyStreamId, SpdyStreamId, const SpdyHeaderBlock&)); }; class FakeSMConnection : public SMConnection { |