Skip to content

feat(util): introduce Chain<A, B> - #178

Merged
cratelyn merged 3 commits into
masterfrom
chain
Sep 1, 2026
Merged

feat(util): introduce Chain<A, B>#178
cratelyn merged 3 commits into
masterfrom
chain

Conversation

@cratelyn

@cratelyn cratelyn commented Aug 28, 2026

Copy link
Copy Markdown
Member

this commit introduces a new body middleware, Chain<A, B>.

similar to std::iter::Iterator::chain(), this provides an adapter to join two bodies together. a new BodyExt::chain() trait method is introduced as a facility to create a chained body using a.chain(b) syntax.

that method will return a new http_body::Body that emits the contents of the first body, and then emits the contents of the second body. if the first body returns an error, the body will consider itself finished and will not poll the second body.

a test suite is included to confirm that this properly handles state transitions for empty bodies, errors, and trailers. the test suite also includes assertions to show that hints (is_end_stream() and size_hint()) work properly.

@cratelyn

This comment was marked as outdated.

this commit introduces a new body middleware, `Chain<A, B>`.

similar to [`std::iter::Iterator::chain()`], this provides an adapter to
join two bodies together. a new [`BodyExt::chain()`] trait method is
introduced as a facility to create a chained body using `a.chain(b)`
syntax.

that method will return a new [`Body`][http_body::Body] that emits the
contents of the first body, and then emits the contents of the second
body.

If the first body returns an error, the body will consider itself
finished and will not poll the second body.

a test suite is included to confirm that this properly handles state
transitions for empty bodies, errors, and trailers. the test suite also
includes assertions to show that hints (`is_end_stream()` and
`size_hint()`) work properly.

Signed-off-by: katelyn martin <git@katelyn.world>
@cratelyn
cratelyn marked this pull request as ready for review August 28, 2026 15:54

@seanmonstar seanmonstar left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Very cool! My first thought at seeing the title was 'what about chained trailers', and you addressed that, thanks! I just left one thought inline regarding potential clarity.

Comment thread http-body-util/src/combinators/chain.rs Outdated
#178 (comment)

Signed-off-by: katelyn martin <git@katelyn.world>
Signed-off-by: katelyn martin <git@katelyn.world>
@cratelyn
cratelyn merged commit df8d547 into master Sep 1, 2026
8 checks passed
@cratelyn
cratelyn deleted the chain branch September 1, 2026 14:46
cratelyn added a commit that referenced this pull request Sep 2, 2026
this commit introduces a `Pending<D, E>` body that is akin to
`futures_util`'s `pending()` future. this is a body that will always
yield `Poll::Pending` when it is polled.

in tandem with `Chain<A, B>` (see #178), this can be used to write test
coverage for hanging request or response bodies, and to exercise timeout
logic.

Signed-off-by: katelyn martin <git@katelyn.world>
cratelyn added a commit that referenced this pull request Sep 2, 2026
this commit introduces a `Pending<D, E>` body that is akin to
`futures_util`'s `pending()` future. this is a body that will always
yield `Poll::Pending` when it is polled.

in tandem with `Chain<A, B>` (see #178), this can be used to write test
coverage for hanging request or response bodies, and to exercise timeout
logic.

Signed-off-by: katelyn martin <git@katelyn.world>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants