Skip to content

Commit

Permalink
web: make HTTP field names case-insensitive
Browse files Browse the repository at this point in the history
I'm opening this PR to (hopefully!) stimulate a discussion. In brief,
I'd like to amend the gRPC-Web protocol docs to encourage
implementations to follow HTTP semantics and compare HTTP field names
case-insensitively.

The gRPC-Web specification is a nicely-designed way for proxies to
expose standard HTTP/2 gRPC servers to clients using less
tightly-controlled HTTP stacks, such as web browsers. To serve that
goal, it seems valuable to have the gRPC-Web specification follow [RFC
9110 (HTTP
Semantics)](https://www.rfc-editor.org/rfc/rfc9110.html#name-field-names).
Like previous RFCs, 9110 specifies that "field names are
case-insensitive." However, the current gRPC-Web specification requires
that servers and proxies "use lower-case header/trailer names" on the
wire. In principle, mandating casing on the wire is normal for HTTP/2
and fine (if unusual) for HTTP/1.1; however, it encourages
implementations to violate HTTP semantics and require lower-case names
when _reading_ headers and trailers.

I'd like to loosen the gRPC-Web specification to permit any casing on
the wire for HTTP/1.1. I'd also like to emphasize that gRPC-Web
implementations ought to follow standard HTTP semantics when _reading_
fields and compare names case-insensitively. This amendment does not
affect the correctness of Envoy (which may continue to use lower-case
field names) or the `grpc-web` Javascript project (which already treats
field names case-insensitively, thanks to the Web Platform's `Headers`
interface). However, it does clarify that `grpc-dart` is _incorrect_ in
relying on lower-case field names.

Relates to improbable-eng/grpc-web#228,
https://github.com/bufbuild/connect-go/issues/453/, and
grpc/grpc-dart#594.
  • Loading branch information
akshayjshah committed Feb 15, 2023
1 parent 054f3c6 commit 7043455
Showing 1 changed file with 8 additions and 2 deletions.
10 changes: 8 additions & 2 deletions doc/PROTOCOL-WEB.md
Original file line number Diff line number Diff line change
Expand Up @@ -48,8 +48,14 @@ Content-Type
HTTP wire protocols

1. support any HTTP/*, with no dependency on HTTP/2 specific framing
2. use lower-case header/trailer names
3. use EOF (end of body) to close the stream
2. send lower-case header/trailer names over HTTP/2 (following [RFC
9113](https://www.rfc-editor.org/rfc/rfc9113#section-8.2-2)) and send
header/trailer names using any case over HTTP/1.1 (following [RFC
9112](https://www.rfc-editor.org/rfc/rfc9112.html#section-5-1))
3. compare header/trailer names case-insensitively (following [RFC
9110](https://www.rfc-editor.org/rfc/rfc9110.html#section-5.1-3)) where
possible, and normalize header/trailer names to lower-case otherwise
4. use EOF (end of body) to close the stream

---

Expand Down

0 comments on commit 7043455

Please sign in to comment.