Avoid OnInvalidFrame() to make content-length errors stream-level in oghttp2.
As background, cl/422597021 made oghttp2 follow nghttp2 on calling the visitor
OnInvalidFrame() to make an integration test pass with a connection-level error
expectation [1], but another test expects a stream-level error instead [2].
These tests both pass with nghttp2 because nghttp2 handles content-length
differently based on whether the end_stream frame is headers/trailers vs. data
(see cl/422597021 description for details). However, preferred behavior is for
content-length errors to be stream-level across the board.
This CL updates oghttp2 such that content-length errors do not call
OnInvalidFrame() and are thus stream-level, for both tests. The expectations in
[1] will be changed to align with HTTP/3.
[1]
http://google3/third_party/envoy/src/test/integration/multiplexed_integration_test.cc;l=1972;rcl=414009764
[2]
http://google3/third_party/envoy/src/test/integration/protocol_integration_test.cc;l=3535;rcl=421694486
PiperOrigin-RevId: 422833845
diff --git a/http2/adapter/http2_util.cc b/http2/adapter/http2_util.cc
index f93b161..553c0bd 100644
--- a/http2/adapter/http2_util.cc
+++ b/http2/adapter/http2_util.cc
@@ -97,8 +97,6 @@
return "InvalidPushPromise";
case ConnectionError::kExceededMaxConcurrentStreams:
return "ExceededMaxConcurrentStreams";
- case ConnectionError::kHttpMessaging:
- return "HttpMessaging";
}
return "UnknownConnectionError";
}
diff --git a/http2/adapter/http2_visitor_interface.h b/http2/adapter/http2_visitor_interface.h
index 61c76b7..0e8619f 100644
--- a/http2/adapter/http2_visitor_interface.h
+++ b/http2/adapter/http2_visitor_interface.h
@@ -78,9 +78,6 @@
kInvalidPushPromise,
// The peer exceeded the max concurrent streams limit.
kExceededMaxConcurrentStreams,
- // The peer violated HTTP messaging semantics.
- // TODO(b/214614028): Remove once these errors can be just RST_STREAM'd.
- kHttpMessaging,
};
virtual void OnConnectionError(ConnectionError error) = 0;
diff --git a/http2/adapter/oghttp2_adapter_test.cc b/http2/adapter/oghttp2_adapter_test.cc
index 3203560..3660d20 100644
--- a/http2/adapter/oghttp2_adapter_test.cc
+++ b/http2/adapter/oghttp2_adapter_test.cc
@@ -4572,8 +4572,8 @@
EXPECT_CALL(visitor, OnSettingsEnd());
// Stream 1: content-length is larger than actual data
- // All data and then OnInvalidFrame() are delivered to the visitor. Note that
- // nghttp2 does not deliver OnInvalidFrame().
+ // All data is delivered to the visitor. Note that neither oghttp2 nor
+ // nghttp2 delivers OnInvalidFrame().
EXPECT_CALL(visitor, OnFrameHeader(1, _, HEADERS, 4));
EXPECT_CALL(visitor, OnBeginHeadersForStream(1));
EXPECT_CALL(visitor, OnHeaderForStream(1, _, _)).Times(5);
@@ -4581,33 +4581,24 @@
EXPECT_CALL(visitor, OnFrameHeader(1, _, DATA, 1));
EXPECT_CALL(visitor, OnBeginDataForStream(1, 1));
EXPECT_CALL(visitor, OnDataForStream(1, "h"));
- EXPECT_CALL(visitor,
- OnInvalidFrame(
- 1, Http2VisitorInterface::InvalidFrameError::kHttpMessaging));
// Stream 3: content-length is smaller than actual data
// The beginning of data is delivered to the visitor, but not the actual data.
- // OnInvalidFrame() is delivered (unlike with nghttp2).
+ // Again, neither oghttp2 nor nghttp2 delivers OnInvalidFrame().
EXPECT_CALL(visitor, OnFrameHeader(3, _, HEADERS, 4));
EXPECT_CALL(visitor, OnBeginHeadersForStream(3));
EXPECT_CALL(visitor, OnHeaderForStream(3, _, _)).Times(5);
EXPECT_CALL(visitor, OnEndHeadersForStream(3));
EXPECT_CALL(visitor, OnFrameHeader(3, _, DATA, 1));
EXPECT_CALL(visitor, OnBeginDataForStream(3, 5));
- EXPECT_CALL(visitor,
- OnInvalidFrame(
- 3, Http2VisitorInterface::InvalidFrameError::kHttpMessaging));
// Stream 5: content-length is invalid and HEADERS ends the stream
- // Only oghttp2 invokes OnEndHeadersForStream(), but both oghttp2 and nghttp2
- // invoke OnInvalidFrame().
+ // Only oghttp2 invokes OnEndHeadersForStream(). Only nghttp2 invokes
+ // OnInvalidFrame().
EXPECT_CALL(visitor, OnFrameHeader(5, _, HEADERS, 5));
EXPECT_CALL(visitor, OnBeginHeadersForStream(5));
EXPECT_CALL(visitor, OnHeaderForStream(5, _, _)).Times(5);
EXPECT_CALL(visitor, OnEndHeadersForStream(5));
- EXPECT_CALL(visitor,
- OnInvalidFrame(
- 5, Http2VisitorInterface::InvalidFrameError::kHttpMessaging));
const int64_t stream_result = adapter->ProcessBytes(stream_frames);
EXPECT_EQ(stream_frames.size(), static_cast<size_t>(stream_result));
diff --git a/http2/adapter/oghttp2_session.cc b/http2/adapter/oghttp2_session.cc
index 59ce29b..827e80b 100644
--- a/http2/adapter/oghttp2_session.cc
+++ b/http2/adapter/oghttp2_session.cc
@@ -1701,15 +1701,6 @@
void OgHttp2Session::HandleContentLengthError(Http2StreamId stream_id) {
EnqueueFrame(absl::make_unique<spdy::SpdyRstStreamIR>(
stream_id, spdy::ERROR_CODE_PROTOCOL_ERROR));
- // TODO(b/214614028): The OnInvalidFrame() is for nghttp2 parity, but parity
- // causes this error to be connection-level in Envoy. Revisit after migration.
- const bool ok = visitor_.OnInvalidFrame(
- stream_id, Http2VisitorInterface::InvalidFrameError::kHttpMessaging);
- if (!ok) {
- fatal_visitor_callback_failure_ = true;
- LatchErrorAndNotify(Http2ErrorCode::REFUSED_STREAM,
- ConnectionError::kHttpMessaging);
- }
}
} // namespace adapter