Adds an integer return value to Http2Adapter::Send(), to indicate success or failure. PiperOrigin-RevId: 380203870
diff --git a/http2/adapter/http2_adapter.h b/http2/adapter/http2_adapter.h index c1ee479..2c66081 100644 --- a/http2/adapter/http2_adapter.h +++ b/http2/adapter/http2_adapter.h
@@ -67,7 +67,8 @@ virtual void SubmitMetadata(Http2StreamId stream_id, bool fin) = 0; // Invokes the visitor's OnReadyToSend() method for serialized frame data. - virtual void Send() = 0; + // Returns 0 on success. + virtual int Send() = 0; // Returns the connection-level flow control window advertised by the peer. virtual int GetSendWindowSize() const = 0;
diff --git a/http2/adapter/nghttp2_adapter.cc b/http2/adapter/nghttp2_adapter.cc index 316fc40..8eac860 100644 --- a/http2/adapter/nghttp2_adapter.cc +++ b/http2/adapter/nghttp2_adapter.cc
@@ -95,11 +95,12 @@ QUICHE_LOG(DFATAL) << "Not implemented"; } -void NgHttp2Adapter::Send() { +int NgHttp2Adapter::Send() { const int result = nghttp2_session_send(session_->raw_ptr()); if (result != 0) { visitor_.OnConnectionError(); } + return result; } int NgHttp2Adapter::GetSendWindowSize() const {
diff --git a/http2/adapter/nghttp2_adapter.h b/http2/adapter/nghttp2_adapter.h index 10573f2..c49d017 100644 --- a/http2/adapter/nghttp2_adapter.h +++ b/http2/adapter/nghttp2_adapter.h
@@ -47,7 +47,7 @@ void SubmitMetadata(Http2StreamId stream_id, bool end_metadata) override; - void Send() override; + int Send() override; int GetSendWindowSize() const override; int GetStreamSendWindowSize(Http2StreamId stream_id) const override;
diff --git a/http2/adapter/nghttp2_adapter_test.cc b/http2/adapter/nghttp2_adapter_test.cc index 92ac949..21a1ded 100644 --- a/http2/adapter/nghttp2_adapter_test.cc +++ b/http2/adapter/nghttp2_adapter_test.cc
@@ -57,7 +57,8 @@ TEST(NgHttp2AdapterTest, ClientHandlesFrames) { DataSavingVisitor visitor; auto adapter = NgHttp2Adapter::CreateClientAdapter(visitor); - adapter->Send(); + int result = adapter->Send(); + EXPECT_EQ(0, result); EXPECT_THAT(visitor.data(), testing::StrEq(spdy::kHttp2ConnectionHeaderPrefix)); visitor.Clear(); @@ -86,7 +87,8 @@ EXPECT_EQ(adapter->GetSendWindowSize(), kInitialFlowControlWindowSize + 1000); // Some bytes should have been serialized. - adapter->Send(); + result = adapter->Send(); + EXPECT_EQ(0, result); EXPECT_THAT(visitor.data(), EqualsFrames({spdy::SpdyFrameType::SETTINGS, spdy::SpdyFrameType::PING})); visitor.Clear(); @@ -136,7 +138,8 @@ adapter->SetStreamUserData(stream_id2, const_cast<char*>(kSentinel2)); adapter->SetStreamUserData(stream_id3, nullptr); - adapter->Send(); + result = adapter->Send(); + EXPECT_EQ(0, result); EXPECT_THAT(visitor.data(), EqualsFrames({spdy::SpdyFrameType::HEADERS, spdy::SpdyFrameType::HEADERS, spdy::SpdyFrameType::HEADERS})); @@ -244,14 +247,16 @@ // Client will not have anything else to write. EXPECT_FALSE(adapter->session().want_write()); - adapter->Send(); + result = adapter->Send(); + EXPECT_EQ(0, result); EXPECT_THAT(visitor.data(), testing::IsEmpty()); } TEST(NgHttp2AdapterTest, ClientSubmitRequest) { DataSavingVisitor visitor; auto adapter = NgHttp2Adapter::CreateClientAdapter(visitor); - adapter->Send(); + int result = adapter->Send(); + EXPECT_EQ(0, result); // Client preface does not appear to include the mandatory SETTINGS frame. EXPECT_THAT(visitor.data(), testing::StrEq(spdy::kHttp2ConnectionHeaderPrefix)); @@ -270,7 +275,8 @@ EXPECT_EQ(initial_frames.size(), initial_result); EXPECT_TRUE(adapter->session().want_write()); - adapter->Send(); + result = adapter->Send(); + EXPECT_EQ(0, result); EXPECT_THAT(visitor.data(), EqualsFrames({spdy::SpdyFrameType::SETTINGS})); visitor.Clear(); @@ -287,7 +293,8 @@ &body1, const_cast<char*>(kSentinel)); EXPECT_GT(stream_id, 0); EXPECT_TRUE(adapter->session().want_write()); - adapter->Send(); + result = adapter->Send(); + EXPECT_EQ(0, result); EXPECT_EQ(kInitialFlowControlWindowSize, adapter->GetStreamReceiveWindowSize(stream_id)); @@ -323,7 +330,8 @@ EXPECT_EQ(nullptr, adapter->GetStreamUserData(stream_id)); adapter->SetStreamUserData(stream_id, const_cast<char*>(kSentinel2)); - adapter->Send(); + result = adapter->Send(); + EXPECT_EQ(0, result); EXPECT_THAT(visitor.data(), EqualsFrames({spdy::SpdyFrameType::HEADERS})); EXPECT_EQ(kSentinel2, adapter->GetStreamUserData(stream_id)); @@ -339,7 +347,8 @@ TEST(NgHttp2AdapterTest, ClientSubmitRequestWithDataProvider) { DataSavingVisitor visitor; auto adapter = NgHttp2Adapter::CreateClientAdapter(visitor); - adapter->Send(); + int result = adapter->Send(); + EXPECT_EQ(0, result); // Client preface does not appear to include the mandatory SETTINGS frame. EXPECT_THAT(visitor.data(), testing::StrEq(spdy::kHttp2ConnectionHeaderPrefix)); @@ -358,7 +367,8 @@ EXPECT_EQ(initial_frames.size(), initial_result); EXPECT_TRUE(adapter->session().want_write()); - adapter->Send(); + result = adapter->Send(); + EXPECT_EQ(0, result); EXPECT_THAT(visitor.data(), EqualsFrames({spdy::SpdyFrameType::SETTINGS})); visitor.Clear(); @@ -382,7 +392,8 @@ frame_source.get(), nullptr); EXPECT_GT(stream_id, 0); EXPECT_TRUE(adapter->session().want_write()); - adapter->Send(); + result = adapter->Send(); + EXPECT_EQ(0, result); EXPECT_THAT(visitor.data(), EqualsFrames({spdy::SpdyFrameType::HEADERS, spdy::SpdyFrameType::DATA})); EXPECT_THAT(visitor.data(), testing::HasSubstr(kBody)); @@ -416,7 +427,8 @@ EXPECT_GT(stream_id, 0); EXPECT_TRUE(adapter->session().want_write()); - adapter->Send(); + int result = adapter->Send(); + EXPECT_EQ(0, result); // Client preface does not appear to include the mandatory SETTINGS frame. absl::string_view serialized = visitor.data(); EXPECT_THAT(serialized, @@ -431,7 +443,8 @@ EXPECT_TRUE(adapter->ResumeStream(stream_id)); EXPECT_TRUE(adapter->session().want_write()); - adapter->Send(); + result = adapter->Send(); + EXPECT_EQ(0, result); EXPECT_THAT(visitor.data(), EqualsFrames({spdy::SpdyFrameType::DATA})); EXPECT_FALSE(adapter->session().want_write()); @@ -467,12 +480,14 @@ EXPECT_TRUE(adapter->session().want_write()); visitor.set_is_write_blocked(true); - adapter->Send(); + int result = adapter->Send(); + EXPECT_EQ(0, result); EXPECT_THAT(visitor.data(), testing::IsEmpty()); EXPECT_TRUE(adapter->session().want_write()); visitor.set_is_write_blocked(false); - adapter->Send(); + result = adapter->Send(); + EXPECT_EQ(0, result); // Client preface does not appear to include the mandatory SETTINGS frame. absl::string_view serialized = visitor.data(); @@ -590,7 +605,8 @@ EXPECT_TRUE(adapter->session().want_write()); // Some bytes should have been serialized. - adapter->Send(); + int send_result = adapter->Send(); + EXPECT_EQ(0, send_result); // SETTINGS ack, two PING acks. EXPECT_THAT(visitor.data(), EqualsFrames({spdy::SpdyFrameType::SETTINGS, spdy::SpdyFrameType::PING, @@ -639,7 +655,8 @@ // Server will want to send a SETTINGS ack. EXPECT_TRUE(adapter->session().want_write()); - adapter->Send(); + int send_result = adapter->Send(); + EXPECT_EQ(0, send_result); EXPECT_THAT(visitor.data(), EqualsFrames({spdy::SpdyFrameType::SETTINGS})); visitor.Clear(); @@ -661,7 +678,8 @@ adapter->SetStreamUserData(1, nullptr); EXPECT_EQ(nullptr, adapter->GetStreamUserData(1)); - adapter->Send(); + send_result = adapter->Send(); + EXPECT_EQ(0, send_result); EXPECT_THAT(visitor.data(), EqualsFrames({spdy::SpdyFrameType::HEADERS, spdy::SpdyFrameType::DATA})); @@ -714,7 +732,8 @@ adapter->SubmitShutdownNotice(); EXPECT_TRUE(adapter->session().want_write()); - adapter->Send(); + int send_result = adapter->Send(); + EXPECT_EQ(0, send_result); EXPECT_THAT(visitor.data(), EqualsFrames({spdy::SpdyFrameType::SETTINGS, spdy::SpdyFrameType::GOAWAY})); } @@ -754,7 +773,8 @@ // Server will want to send a SETTINGS ack. EXPECT_TRUE(adapter->session().want_write()); - adapter->Send(); + int send_result = adapter->Send(); + EXPECT_EQ(0, send_result); EXPECT_THAT(visitor.data(), EqualsFrames({spdy::SpdyFrameType::SETTINGS})); visitor.Clear(); @@ -770,7 +790,8 @@ EXPECT_EQ(submit_result, 0); EXPECT_TRUE(adapter->session().want_write()); EXPECT_CALL(visitor, OnCloseStream(1, Http2ErrorCode::NO_ERROR)); - adapter->Send(); + send_result = adapter->Send(); + EXPECT_EQ(0, send_result); EXPECT_THAT(visitor.data(), EqualsFrames({spdy::SpdyFrameType::HEADERS, spdy::SpdyFrameType::DATA})); EXPECT_THAT(visitor.data(), testing::HasSubstr(kBody)); @@ -784,7 +805,8 @@ ASSERT_EQ(trailer_result, 0); EXPECT_TRUE(adapter->session().want_write()); - adapter->Send(); + send_result = adapter->Send(); + EXPECT_EQ(0, send_result); EXPECT_THAT(visitor.data(), EqualsFrames({spdy::SpdyFrameType::HEADERS})); }
diff --git a/http2/adapter/oghttp2_adapter.cc b/http2/adapter/oghttp2_adapter.cc index e87afa9..6f56d40 100644 --- a/http2/adapter/oghttp2_adapter.cc +++ b/http2/adapter/oghttp2_adapter.cc
@@ -79,9 +79,7 @@ QUICHE_BUG(oghttp2_submit_metadata) << "Not implemented"; } -void OgHttp2Adapter::Send() { - session_->Send(); -} +int OgHttp2Adapter::Send() { return session_->Send(); } int OgHttp2Adapter::GetSendWindowSize() const { return session_->GetRemoteWindowSize();
diff --git a/http2/adapter/oghttp2_adapter.h b/http2/adapter/oghttp2_adapter.h index 03f7b69..b796e1e 100644 --- a/http2/adapter/oghttp2_adapter.h +++ b/http2/adapter/oghttp2_adapter.h
@@ -34,7 +34,7 @@ void SubmitWindowUpdate(Http2StreamId stream_id, int window_increment) override; void SubmitMetadata(Http2StreamId stream_id, bool fin) override; - void Send() override; + int Send() override; int GetSendWindowSize() const override; int GetStreamSendWindowSize(Http2StreamId stream_id) const override; int GetStreamReceiveWindowLimit(Http2StreamId stream_id) const override;
diff --git a/http2/adapter/oghttp2_adapter_test.cc b/http2/adapter/oghttp2_adapter_test.cc index 1675bda..9f4da15 100644 --- a/http2/adapter/oghttp2_adapter_test.cc +++ b/http2/adapter/oghttp2_adapter_test.cc
@@ -68,7 +68,8 @@ adapter_->SubmitWindowUpdate(3, 127); EXPECT_TRUE(adapter_->session().want_write()); - adapter_->Send(); + int result = adapter_->Send(); + EXPECT_EQ(0, result); EXPECT_THAT( http2_visitor_.data(), EqualsFrames({SpdyFrameType::SETTINGS, SpdyFrameType::PRIORITY, @@ -87,11 +88,14 @@ EXPECT_TRUE(adapter_->session().want_write()); http2_visitor_.set_send_limit(20); - adapter_->Send(); + int result = adapter_->Send(); + EXPECT_EQ(0, result); EXPECT_TRUE(adapter_->session().want_write()); - adapter_->Send(); + result = adapter_->Send(); + EXPECT_EQ(0, result); EXPECT_TRUE(adapter_->session().want_write()); - adapter_->Send(); + result = adapter_->Send(); + EXPECT_EQ(0, result); EXPECT_FALSE(adapter_->session().want_write()); EXPECT_THAT(http2_visitor_.data(), EqualsFrames({SpdyFrameType::SETTINGS, SpdyFrameType::GOAWAY,
diff --git a/http2/adapter/oghttp2_session.cc b/http2/adapter/oghttp2_session.cc index 0ee64d7..949c67b 100644 --- a/http2/adapter/oghttp2_session.cc +++ b/http2/adapter/oghttp2_session.cc
@@ -163,7 +163,7 @@ frames_.push_back(std::move(frame)); } -void OgHttp2Session::Send() { +int OgHttp2Session::Send() { MaybeSetupPreface(); ssize_t result = std::numeric_limits<ssize_t>::max(); // Flush any serialized prefix. @@ -174,7 +174,7 @@ } } if (!serialized_prefix_.empty()) { - return; + return result < 0 ? result : 0; } bool continue_writing = SendQueuedFrames(); // Wake streams for writes. @@ -188,6 +188,7 @@ if (continue_writing) { SendQueuedFrames(); } + return 0; } bool OgHttp2Session::SendQueuedFrames() {
diff --git a/http2/adapter/oghttp2_session.h b/http2/adapter/oghttp2_session.h index 8e2a7ee..a22811f 100644 --- a/http2/adapter/oghttp2_session.h +++ b/http2/adapter/oghttp2_session.h
@@ -35,7 +35,7 @@ void StartGracefulShutdown(); // Invokes the visitor's OnReadyToSend() method for serialized frame data. - void Send(); + int Send(); int32_t SubmitRequest(absl::Span<const Header> headers, DataFrameSource* data_source, @@ -180,7 +180,8 @@ void SendWindowUpdate(Http2StreamId stream_id, size_t update_delta); - // Sends queued frames, returning true if all frames were flushed. + // Sends queued frames, returning true if all frames were flushed + // successfully. bool SendQueuedFrames(); // Returns false if the connection is write-blocked (due to flow control or
diff --git a/http2/adapter/oghttp2_session_test.cc b/http2/adapter/oghttp2_session_test.cc index be53e47..73e59b0 100644 --- a/http2/adapter/oghttp2_session_test.cc +++ b/http2/adapter/oghttp2_session_test.cc
@@ -138,7 +138,8 @@ OgHttp2Session session( visitor, OgHttp2Session::Options{.perspective = Perspective::kClient}); EXPECT_FALSE(session.want_write()); - session.Send(); + int result = session.Send(); + EXPECT_EQ(0, result); absl::string_view serialized = visitor.data(); EXPECT_THAT(serialized, testing::StartsWith(spdy::kHttp2ConnectionHeaderPrefix)); @@ -155,7 +156,8 @@ EXPECT_FALSE(session.want_write()); session.EnqueueFrame(absl::make_unique<spdy::SpdyPingIR>(42)); EXPECT_TRUE(session.want_write()); - session.Send(); + int result = session.Send(); + EXPECT_EQ(0, result); absl::string_view serialized = visitor.data(); EXPECT_THAT(serialized, testing::StartsWith(spdy::kHttp2ConnectionHeaderPrefix)); @@ -173,7 +175,8 @@ EXPECT_FALSE(session.want_write()); session.EnqueueFrame(absl::make_unique<spdy::SpdySettingsIR>()); EXPECT_TRUE(session.want_write()); - session.Send(); + int result = session.Send(); + EXPECT_EQ(0, result); absl::string_view serialized = visitor.data(); EXPECT_THAT(serialized, testing::StartsWith(spdy::kHttp2ConnectionHeaderPrefix)); @@ -190,7 +193,8 @@ // Even though the user has not queued any frames for the session, it should // still send the connection preface. - session.Send(); + int result = session.Send(); + EXPECT_EQ(0, result); absl::string_view serialized = visitor.data(); EXPECT_THAT(serialized, testing::StartsWith(spdy::kHttp2ConnectionHeaderPrefix)); @@ -213,7 +217,8 @@ // Session will want to write a SETTINGS ack. EXPECT_TRUE(session.want_write()); - session.Send(); + result = session.Send(); + EXPECT_EQ(0, result); EXPECT_THAT(visitor.data(), EqualsFrames({SpdyFrameType::SETTINGS})); visitor.Clear(); @@ -230,7 +235,8 @@ EXPECT_GT(stream_id, 0); EXPECT_TRUE(session.want_write()); EXPECT_EQ(kSentinel1, session.GetStreamUserData(stream_id)); - session.Send(); + result = session.Send(); + EXPECT_EQ(0, result); EXPECT_THAT(visitor.data(), EqualsFrames({spdy::SpdyFrameType::HEADERS, spdy::SpdyFrameType::DATA})); visitor.Clear(); @@ -259,7 +265,8 @@ session.SetStreamUserData(stream_id, const_cast<char*>(kSentinel2)); EXPECT_EQ(kSentinel2, session.GetStreamUserData(stream_id)); - session.Send(); + result = session.Send(); + EXPECT_EQ(0, result); EXPECT_THAT(visitor.data(), EqualsFrames({spdy::SpdyFrameType::HEADERS})); // No data was sent (just HEADERS), so the remaining send window size should @@ -288,7 +295,8 @@ EXPECT_GT(stream_id, 0); EXPECT_TRUE(session.want_write()); EXPECT_EQ(kSentinel1, session.GetStreamUserData(stream_id)); - session.Send(); + int result = session.Send(); + EXPECT_EQ(0, result); absl::string_view serialized = visitor.data(); EXPECT_THAT(serialized, testing::StartsWith(spdy::kHttp2ConnectionHeaderPrefix)); @@ -302,7 +310,8 @@ body1.set_is_data_available(true); EXPECT_TRUE(session.ResumeStream(stream_id)); EXPECT_TRUE(session.want_write()); - session.Send(); + result = session.Send(); + EXPECT_EQ(0, result); EXPECT_THAT(visitor.data(), EqualsFrames({SpdyFrameType::DATA})); EXPECT_FALSE(session.want_write()); @@ -331,12 +340,14 @@ EXPECT_TRUE(session.want_write()); EXPECT_EQ(kSentinel1, session.GetStreamUserData(stream_id)); visitor.set_is_write_blocked(true); - session.Send(); + int result = session.Send(); + EXPECT_EQ(0, result); EXPECT_THAT(visitor.data(), testing::IsEmpty()); EXPECT_TRUE(session.want_write()); visitor.set_is_write_blocked(false); - session.Send(); + result = session.Send(); + EXPECT_EQ(0, result); absl::string_view serialized = visitor.data(); EXPECT_THAT(serialized, @@ -359,7 +370,9 @@ session.StartGracefulShutdown(); EXPECT_FALSE(session.want_write()); - session.Send(); + int result = session.Send(); + EXPECT_EQ(0, result); + absl::string_view serialized = visitor.data(); EXPECT_THAT(serialized, testing::StartsWith(spdy::kHttp2ConnectionHeaderPrefix)); @@ -477,7 +490,8 @@ EXPECT_TRUE(session.want_write()); // Some bytes should have been serialized. - session.Send(); + int send_result = session.Send(); + EXPECT_EQ(0, send_result); // Initial SETTINGS, SETTINGS ack. // TODO(birenroy): automatically queue PING acks. EXPECT_THAT(visitor.data(), EqualsFrames({spdy::SpdyFrameType::SETTINGS, @@ -493,7 +507,8 @@ EXPECT_FALSE(session.want_write()); session.EnqueueFrame(absl::make_unique<spdy::SpdyPingIR>(42)); EXPECT_TRUE(session.want_write()); - session.Send(); + int result = session.Send(); + EXPECT_EQ(0, result); EXPECT_THAT(visitor.data(), EqualsFrames({SpdyFrameType::SETTINGS, SpdyFrameType::PING})); } @@ -507,7 +522,8 @@ EXPECT_FALSE(session.want_write()); session.EnqueueFrame(absl::make_unique<spdy::SpdySettingsIR>()); EXPECT_TRUE(session.want_write()); - session.Send(); + int result = session.Send(); + EXPECT_EQ(0, result); EXPECT_THAT(visitor.data(), EqualsFrames({SpdyFrameType::SETTINGS})); } @@ -557,7 +573,8 @@ // Server will want to send initial SETTINGS, and a SETTINGS ack. EXPECT_TRUE(session.want_write()); - session.Send(); + int send_result = session.Send(); + EXPECT_EQ(0, send_result); EXPECT_THAT(visitor.data(), EqualsFrames({SpdyFrameType::SETTINGS, SpdyFrameType::SETTINGS})); visitor.Clear(); @@ -578,7 +595,8 @@ session.SetStreamUserData(1, nullptr); EXPECT_EQ(nullptr, session.GetStreamUserData(1)); - session.Send(); + send_result = session.Send(); + EXPECT_EQ(0, send_result); EXPECT_THAT(visitor.data(), EqualsFrames({SpdyFrameType::HEADERS, SpdyFrameType::DATA})); EXPECT_FALSE(session.want_write()); @@ -602,7 +620,8 @@ session.StartGracefulShutdown(); EXPECT_TRUE(session.want_write()); - session.Send(); + int result = session.Send(); + EXPECT_EQ(0, result); EXPECT_THAT(visitor.data(), EqualsFrames({SpdyFrameType::SETTINGS, SpdyFrameType::GOAWAY})); } @@ -619,7 +638,8 @@ session.EnqueueFrame(std::move(goaway)); EXPECT_TRUE(session.want_write()); - session.Send(); + int result = session.Send(); + EXPECT_EQ(0, result); EXPECT_THAT(visitor.data(), EqualsFrames({SpdyFrameType::SETTINGS, SpdyFrameType::GOAWAY})); @@ -667,7 +687,8 @@ // Server will want to send initial SETTINGS, and a SETTINGS ack. EXPECT_TRUE(session.want_write()); - session.Send(); + int send_result = session.Send(); + EXPECT_EQ(0, send_result); EXPECT_THAT(visitor.data(), EqualsFrames({SpdyFrameType::SETTINGS, SpdyFrameType::SETTINGS})); visitor.Clear(); @@ -683,7 +704,8 @@ &body1); EXPECT_EQ(submit_result, 0); EXPECT_TRUE(session.want_write()); - session.Send(); + send_result = session.Send(); + EXPECT_EQ(0, send_result); EXPECT_THAT(visitor.data(), EqualsFrames({SpdyFrameType::HEADERS, SpdyFrameType::DATA})); visitor.Clear(); @@ -697,7 +719,8 @@ ASSERT_EQ(trailer_result, 0); EXPECT_TRUE(session.want_write()); - session.Send(); + send_result = session.Send(); + EXPECT_EQ(0, send_result); EXPECT_THAT(visitor.data(), EqualsFrames({SpdyFrameType::HEADERS})); } @@ -740,7 +763,8 @@ // Server will want to send initial SETTINGS, and a SETTINGS ack. EXPECT_TRUE(session.want_write()); - session.Send(); + int send_result = session.Send(); + EXPECT_EQ(0, send_result); EXPECT_THAT(visitor.data(), EqualsFrames({SpdyFrameType::SETTINGS, SpdyFrameType::SETTINGS})); visitor.Clear(); @@ -765,7 +789,8 @@ EXPECT_TRUE(session.want_write()); EXPECT_CALL(visitor, OnCloseStream(1, Http2ErrorCode::NO_ERROR)); - session.Send(); + send_result = session.Send(); + EXPECT_EQ(0, send_result); EXPECT_THAT(visitor.data(), EqualsFrames({SpdyFrameType::HEADERS, SpdyFrameType::DATA, SpdyFrameType::HEADERS}));