Miscellaneous fixes in OgHttp2Session.
* Clears a stream from additional maps when it is closed.
* Casts a parameter to FrameType for better readability.
* Verifies that DATA frames are not queued.
PiperOrigin-RevId: 421369135
diff --git a/http2/adapter/oghttp2_session.cc b/http2/adapter/oghttp2_session.cc
index 016792a..bc8100f 100644
--- a/http2/adapter/oghttp2_session.cc
+++ b/http2/adapter/oghttp2_session.cc
@@ -633,6 +633,10 @@
const auto& frame_ptr = frames_.front();
FrameAttributeCollector c;
frame_ptr->Visit(&c);
+
+ // DATA frames should never be queued.
+ QUICHE_DCHECK_NE(c.frame_type(), 0);
+
// Frames can't accurately report their own length; the actual serialized
// length must be used instead.
spdy::SpdySerializedFrame frame = framer_.SerializeFrame(*frame_ptr);
@@ -669,16 +673,17 @@
return SendResult::SEND_OK;
}
-bool OgHttp2Session::AfterFrameSent(uint8_t frame_type, uint32_t stream_id,
+bool OgHttp2Session::AfterFrameSent(uint8_t frame_type_int, uint32_t stream_id,
size_t payload_length, uint8_t flags,
uint32_t error_code) {
- int result = visitor_.OnFrameSent(frame_type, stream_id, payload_length,
+ const FrameType frame_type = static_cast<FrameType>(frame_type_int);
+ int result = visitor_.OnFrameSent(frame_type_int, stream_id, payload_length,
flags, error_code);
if (result < 0) {
return false;
}
if (stream_id == 0) {
- if (static_cast<FrameType>(frame_type) == FrameType::SETTINGS) {
+ if (frame_type == FrameType::SETTINGS) {
const bool is_settings_ack = (flags & 0x01);
if (is_settings_ack && encoder_header_table_capacity_when_acking_) {
framer_.UpdateHeaderEncoderTableSize(
@@ -691,12 +696,12 @@
return true;
}
auto iter = queued_frames_.find(stream_id);
- if (frame_type != 0) {
+ if (frame_type != FrameType::DATA) {
--iter->second;
}
if (iter->second == 0) {
// TODO(birenroy): Consider passing through `error_code` here.
- CloseStreamIfReady(frame_type, stream_id);
+ CloseStreamIfReady(frame_type_int, stream_id);
}
return true;
}
@@ -1493,6 +1498,9 @@
stream_map_.erase(stream_id);
trailers_ready_.erase(stream_id);
metadata_ready_.erase(stream_id);
+ streams_reset_.erase(stream_id);
+ queued_frames_.erase(stream_id);
+ stream_map_.erase(stream_id);
if (write_scheduler_.StreamRegistered(stream_id)) {
write_scheduler_.UnregisterStream(stream_id);
}
diff --git a/http2/adapter/oghttp2_session.h b/http2/adapter/oghttp2_session.h
index 97cff20..eaef9bd 100644
--- a/http2/adapter/oghttp2_session.h
+++ b/http2/adapter/oghttp2_session.h
@@ -330,7 +330,7 @@
SendResult SendQueuedFrames();
// Returns false if a fatal connection error occurred.
- bool AfterFrameSent(uint8_t frame_type, uint32_t stream_id,
+ bool AfterFrameSent(uint8_t frame_type_int, uint32_t stream_id,
size_t payload_length, uint8_t flags,
uint32_t error_code);