Hacktoberfest 2026: the issues maintainers tagged for October, open and beginner-friendly. Browse Hacktoberfest issues

Early-response RST_STREAM(NO_ERROR) counts toward max_local_error_reset_streams

Open Beginner friendly
#974 1 comment 0 reactions 0 assignees View on GitHub

Maintainers usually reply within 1 day

Nobody has claimed this yet.

Assessment

Difficulty
2/5
Estimated time
1-3 hours
Newbie friendliness
80/100
Issue type
Bug
Clarity
Clearly specified
Activity status
Active
Tech stack
rust
Domain
networking

Research direction

Start from Actions::send_reset and maybe_cancel in the h2 source. Find where the local error reset counter is incremented and add a condition to skip counting when the reason is NO_ERROR and the early-response path (is_send_closed() && is_recv_streaming()) is active. Add a test that triggers an early response and verifies the limit is not affected.

Written by the indexing model from the issue text.

Description

Actions::send_reset counts every library-initiated reset toward max_local_error_reset_streams (default 1024), including the RST_STREAM(NO_ERROR) that maybe_cancel sends when a server has fully responded before consuming the request body (RFC 9113 §8.1, the "early response" case the code comment cites). That reset is not an error and is not triggered by peer misbehaviour, but it counts like one.

Observed with a gRPC server (NativeLink, hyper 1.7 / h2 0.4.19, also present in 0.4.20) on a long-lived connection carrying CAS uploads. When a blob already exists, the server answers ByteStream.Write immediately (HEADERS + DATA + trailers with END_STREAM) and drops the request body; h2 then sends RST_STREAM(NO_ERROR). A packet capture of one connection showed 1,637 such NO_ERROR resets plus 903 STREAM_CLOSED, then GOAWAY(ENHANCE_YOUR_CALM, "too_many_internal_resets"), which tore down every in-flight upload on the connection. The client sent no DATA on any already-closed stream, and there was no REFUSED_STREAM or FLOW_CONTROL. The connection was well-behaved; the guard fired only because legitimate early responses accumulated.

Suggestion: do not count Reason::NO_ERROR resets produced by the early-response path (maybe_cancel with is_send_closed() && is_recv_streaming()) toward the local error reset limit, or count them separately. Related: #856, #966.

Dominant language
Rust
Stars
1.6k
Forks
395
Avg merge
6h 3m
Merged PRs (30d)
8

Getting set up

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

More from hyperium/h2

All issues in hyperium/h2

Similar issues

More Rust issues

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.