hyperium / hyper

An HTTP library for Rust
https://hyper.rs
MIT License
14.42k stars 1.59k forks source link

fix(http2): "Trailer" header should be allowed in HTTP/2 responses as per RFC 9110 #3648

Closed lqs closed 5 months ago

lqs commented 5 months ago

This pull request addresses the incorrect handling of the Trailer header in HTTP/2 responses within the hyper project. According to RFC 9110 "HTTP Semantics", the Trailer header is not listed as a "hop-by-hop" header in section 7.6.1. RFC 9110 specifies that a sender intending to generate one or more trailer fields in a message should use the Trailer header in the header section to indicate potential trailer fields, as mentioned in section 6.6.2.

The current implementation in hyper may result in unnecessary warnings for gRPC calls, as gRPC implementations, such as grpc-go, routinely use the Trailer header to indicate the presence of trailers after the response body. (See this behavior in grpc-go's implementation.

This fix updates hyper to correctly allow the Trailer header in HTTP/2 responses, aligning it with RFC 9110 and preventing misleading warnings in environments using gRPC, such as linkerd2-proxy, which prints a warning Connection header illegal in HTTP/2: trailer on every gRPC call.

Note: Mozilla's documentation mistakenly lists Trailer as a hop-by-hop header, which is incorrect.