Allows OgHttp2Adapter to send GOAWAYs when operating as a client. PiperOrigin-RevId: 431751433
diff --git a/http2/adapter/oghttp2_adapter_test.cc b/http2/adapter/oghttp2_adapter_test.cc index 0dc53ce..b87c38a 100644 --- a/http2/adapter/oghttp2_adapter_test.cc +++ b/http2/adapter/oghttp2_adapter_test.cc
@@ -1185,14 +1185,16 @@ // Negative integer returned to indicate an error. EXPECT_LT(stream_result, 0); - EXPECT_CALL(visitor, OnBeforeFrameSent(SETTINGS, 0, _, 0x1)); - EXPECT_CALL(visitor, OnFrameSent(SETTINGS, 0, _, 0x1, 0)); + EXPECT_CALL(visitor, OnBeforeFrameSent(GOAWAY, 0, _, 0x0)); + EXPECT_CALL(visitor, + OnFrameSent(GOAWAY, 0, _, 0x0, + static_cast<int>(Http2ErrorCode::INTERNAL_ERROR))); EXPECT_FALSE(adapter->want_read()); EXPECT_TRUE(adapter->want_write()); result = adapter->Send(); EXPECT_EQ(0, result); - EXPECT_THAT(visitor.data(), EqualsFrames({SpdyFrameType::SETTINGS})); + EXPECT_THAT(visitor.data(), EqualsFrames({SpdyFrameType::GOAWAY})); } TEST(OgHttp2AdapterTest, ClientHandlesMetadataWithCompletionError) { @@ -1258,14 +1260,16 @@ // Negative integer returned to indicate an error. EXPECT_LT(stream_result, 0); - EXPECT_CALL(visitor, OnBeforeFrameSent(SETTINGS, 0, _, 0x1)); - EXPECT_CALL(visitor, OnFrameSent(SETTINGS, 0, _, 0x1, 0)); + EXPECT_CALL(visitor, OnBeforeFrameSent(GOAWAY, 0, _, 0x0)); + EXPECT_CALL(visitor, + OnFrameSent(GOAWAY, 0, _, 0x0, + static_cast<int>(Http2ErrorCode::INTERNAL_ERROR))); EXPECT_FALSE(adapter->want_read()); EXPECT_TRUE(adapter->want_write()); result = adapter->Send(); EXPECT_EQ(0, result); - EXPECT_THAT(visitor.data(), EqualsFrames({SpdyFrameType::SETTINGS})); + EXPECT_THAT(visitor.data(), EqualsFrames({SpdyFrameType::GOAWAY})); } TEST(OgHttp2AdapterTest, ClientRstStreamWhileHandlingHeaders) { @@ -1409,13 +1413,15 @@ const int64_t stream_result = adapter->ProcessBytes(stream_frames); EXPECT_LT(stream_result, 0); - EXPECT_CALL(visitor, OnBeforeFrameSent(SETTINGS, 0, 0, 0x1)); - EXPECT_CALL(visitor, OnFrameSent(SETTINGS, 0, 0, 0x1, 0)); + EXPECT_CALL(visitor, OnBeforeFrameSent(GOAWAY, 0, _, 0x0)); + EXPECT_CALL(visitor, + OnFrameSent(GOAWAY, 0, _, 0x0, + static_cast<int>(Http2ErrorCode::INTERNAL_ERROR))); EXPECT_TRUE(adapter->want_write()); result = adapter->Send(); EXPECT_EQ(0, result); - EXPECT_THAT(visitor.data(), EqualsFrames({SpdyFrameType::SETTINGS})); + EXPECT_THAT(visitor.data(), EqualsFrames({SpdyFrameType::GOAWAY})); } TEST(OgHttp2AdapterTest, ClientConnectionErrorWhileHandlingHeadersOnly) { @@ -1479,13 +1485,15 @@ const int64_t stream_result = adapter->ProcessBytes(stream_frames); EXPECT_LT(stream_result, 0); - EXPECT_CALL(visitor, OnBeforeFrameSent(SETTINGS, 0, 0, 0x1)); - EXPECT_CALL(visitor, OnFrameSent(SETTINGS, 0, 0, 0x1, 0)); + EXPECT_CALL(visitor, OnBeforeFrameSent(GOAWAY, 0, _, 0x0)); + EXPECT_CALL(visitor, + OnFrameSent(GOAWAY, 0, _, 0x0, + static_cast<int>(Http2ErrorCode::INTERNAL_ERROR))); EXPECT_TRUE(adapter->want_write()); result = adapter->Send(); EXPECT_EQ(0, result); - EXPECT_THAT(visitor.data(), EqualsFrames({SpdyFrameType::SETTINGS})); + EXPECT_THAT(visitor.data(), EqualsFrames({SpdyFrameType::GOAWAY})); } TEST(OgHttp2AdapterTest, ClientRejectsHeaders) { @@ -1546,13 +1554,15 @@ const int64_t stream_result = adapter->ProcessBytes(stream_frames); EXPECT_LT(stream_result, 0); - EXPECT_CALL(visitor, OnBeforeFrameSent(SETTINGS, 0, 0, 0x1)); - EXPECT_CALL(visitor, OnFrameSent(SETTINGS, 0, 0, 0x1, 0)); + EXPECT_CALL(visitor, OnBeforeFrameSent(GOAWAY, 0, _, 0x0)); + EXPECT_CALL(visitor, + OnFrameSent(GOAWAY, 0, _, 0x0, + static_cast<int>(Http2ErrorCode::INTERNAL_ERROR))); EXPECT_TRUE(adapter->want_write()); result = adapter->Send(); EXPECT_EQ(0, result); - EXPECT_THAT(visitor.data(), EqualsFrames({SpdyFrameType::SETTINGS})); + EXPECT_THAT(visitor.data(), EqualsFrames({SpdyFrameType::GOAWAY})); } TEST(OgHttp2AdapterTest, ClientHandlesSmallerHpackHeaderTableSetting) { @@ -1953,13 +1963,15 @@ const int64_t stream_result = adapter->ProcessBytes(stream_frames); EXPECT_LT(stream_result, 0); - EXPECT_CALL(visitor, OnBeforeFrameSent(SETTINGS, 0, 0, 0x1)); - EXPECT_CALL(visitor, OnFrameSent(SETTINGS, 0, 0, 0x1, 0)); + EXPECT_CALL(visitor, OnBeforeFrameSent(GOAWAY, 0, _, 0x0)); + EXPECT_CALL(visitor, + OnFrameSent(GOAWAY, 0, _, 0x0, + static_cast<int>(Http2ErrorCode::INTERNAL_ERROR))); EXPECT_TRUE(adapter->want_write()); result = adapter->Send(); EXPECT_EQ(0, result); - EXPECT_THAT(visitor.data(), EqualsFrames({SpdyFrameType::SETTINGS})); + EXPECT_THAT(visitor.data(), EqualsFrames({SpdyFrameType::GOAWAY})); } TEST(OgHttp2AdapterTest, ClientRejects101Response) { @@ -2351,8 +2363,11 @@ EXPECT_CALL(visitor, OnBeforeFrameSent(SETTINGS, 0, _, 0x0)); EXPECT_CALL(visitor, OnFrameSent(SETTINGS, 0, _, 0x0, 0)); - EXPECT_CALL(visitor, OnBeforeFrameSent(SETTINGS, 0, _, 0x1)); - EXPECT_CALL(visitor, OnFrameSent(SETTINGS, 0, _, 0x1, 0)); + EXPECT_CALL(visitor, OnBeforeFrameSent(GOAWAY, 0, _, 0x0)); + EXPECT_CALL( + visitor, + OnFrameSent(GOAWAY, 0, _, 0x0, + static_cast<int>(Http2ErrorCode::FLOW_CONTROL_ERROR))); int64_t result = adapter->Send(); EXPECT_EQ(0, result); @@ -2361,7 +2376,7 @@ testing::StartsWith(spdy::kHttp2ConnectionHeaderPrefix)); serialized.remove_prefix(strlen(spdy::kHttp2ConnectionHeaderPrefix)); EXPECT_THAT(serialized, - EqualsFrames({SpdyFrameType::SETTINGS, SpdyFrameType::SETTINGS})); + EqualsFrames({SpdyFrameType::SETTINGS, SpdyFrameType::GOAWAY})); visitor.Clear(); } @@ -2522,13 +2537,14 @@ EXPECT_TRUE(adapter->want_write()); - EXPECT_CALL(visitor, OnBeforeFrameSent(SETTINGS, 0, _, 0x1)); - EXPECT_CALL(visitor, OnFrameSent(SETTINGS, 0, _, 0x1, 0)); + EXPECT_CALL(visitor, OnBeforeFrameSent(GOAWAY, 0, _, 0x0)); + EXPECT_CALL(visitor, + OnFrameSent(GOAWAY, 0, _, 0x0, + static_cast<int>(Http2ErrorCode::PROTOCOL_ERROR))); int result = adapter->Send(); EXPECT_EQ(0, result); - // SETTINGS ack. - EXPECT_THAT(visitor.data(), EqualsFrames({SpdyFrameType::SETTINGS})); + EXPECT_THAT(visitor.data(), EqualsFrames({SpdyFrameType::GOAWAY})); } TEST(OgHttp2AdapterTest, ClientForbidsPushStream) { @@ -2594,13 +2610,14 @@ EXPECT_TRUE(adapter->want_write()); - EXPECT_CALL(visitor, OnBeforeFrameSent(SETTINGS, 0, _, 0x1)); - EXPECT_CALL(visitor, OnFrameSent(SETTINGS, 0, _, 0x1, 0)); + EXPECT_CALL(visitor, OnBeforeFrameSent(GOAWAY, 0, _, 0x0)); + EXPECT_CALL(visitor, + OnFrameSent(GOAWAY, 0, _, 0x0, + static_cast<int>(Http2ErrorCode::PROTOCOL_ERROR))); int result = adapter->Send(); EXPECT_EQ(0, result); - // SETTINGS ack. - EXPECT_THAT(visitor.data(), EqualsFrames({SpdyFrameType::SETTINGS})); + EXPECT_THAT(visitor.data(), EqualsFrames({SpdyFrameType::GOAWAY})); } TEST(OgHttp2AdapterTest, ClientReceivesDataOnClosedStream) {
diff --git a/http2/adapter/oghttp2_session.cc b/http2/adapter/oghttp2_session.cc index 45fecd9..a914ee7 100644 --- a/http2/adapter/oghttp2_session.cc +++ b/http2/adapter/oghttp2_session.cc
@@ -1730,11 +1730,9 @@ latched_error_ = true; visitor_.OnConnectionError(error); decoder_.StopProcessing(); - if (IsServerSession()) { - EnqueueFrame(absl::make_unique<spdy::SpdyGoAwayIR>( - highest_processed_stream_id_, TranslateErrorCode(error_code), - ConnectionErrorToString(error))); - } + EnqueueFrame(absl::make_unique<spdy::SpdyGoAwayIR>( + highest_processed_stream_id_, TranslateErrorCode(error_code), + ConnectionErrorToString(error))); } void OgHttp2Session::CloseStreamIfReady(uint8_t frame_type,