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);