summaryrefslogtreecommitdiffstats
path: root/net
diff options
context:
space:
mode:
authorbaranovich@yandex-team.ru <baranovich@yandex-team.ru@0039d316-1c4b-4281-b951-d872f2087c98>2014-05-30 05:24:18 +0000
committerbaranovich@yandex-team.ru <baranovich@yandex-team.ru@0039d316-1c4b-4281-b951-d872f2087c98>2014-05-30 05:24:18 +0000
commitc119036841f420a385e893a4316a55fbd511e442 (patch)
tree696e414e415dd24344e90d3376323c27202e4d69 /net
parent53ec557e6e24a6d54deedff335083644fb5b608e (diff)
downloadchromium_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.cc27
-rw-r--r--net/spdy/buffered_spdy_framer.h7
-rw-r--r--net/spdy/buffered_spdy_framer_unittest.cc49
-rw-r--r--net/spdy/spdy_session.cc3
-rw-r--r--net/spdy/spdy_session.h3
-rw-r--r--net/spdy/spdy_test_util_common.cc11
-rw-r--r--net/tools/flip_server/spdy_interface.h3
-rw-r--r--net/tools/flip_server/spdy_interface_test.cc3
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 {