internal/http3: snapshot response headers at WriteHeader time

HTTP/3 currently buffers small body writes. As a result, if a server
handler modifies its headers after WriteHeader has been called, the
modified headers will be sent by the server as part of its response.
This behavior is generally unexpected and inconsistent with our HTTP/2
implementation.

Therefore, change HTTP/3 server to snapshot the headers at WriteHeader
time, to ensure that buffering responses will not result in different
headers being sent.

For golang/go#70914

Change-Id: Ie1ed44f2cfc3d60ac28d8bb64118bd846a6a6964
Reviewed-on: https://go-review.googlesource.com/c/net/+/784960
LUCI-TryBot-Result: golang-scoped@luci-project-accounts.iam.gserviceaccount.com <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: Damien Neil <dneil@google.com>
Reviewed-by: Nicholas Husin <husin@google.com>
2 files changed
tree: 775c8ae1b26943970b073ecccb48c0bd96929304
  1. bpf/
  2. context/
  3. dict/
  4. dns/
  5. html/
  6. http/
  7. http2/
  8. http3/
  9. icmp/
  10. idna/
  11. internal/
  12. ipv4/
  13. ipv6/
  14. lif/
  15. nettest/
  16. netutil/
  17. proxy/
  18. publicsuffix/
  19. quic/
  20. route/
  21. trace/
  22. webdav/
  23. websocket/
  24. xsrftoken/
  25. .gitattributes
  26. .gitignore
  27. codereview.cfg
  28. CONTRIBUTING.md
  29. go.mod
  30. go.sum
  31. LICENSE
  32. PATENTS
  33. README.md
README.md

Go Networking

Go Reference

This repository holds supplementary Go networking packages.

Report Issues / Send Patches

This repository uses Gerrit for code changes. To learn how to submit changes to this repository, see https://go.dev/doc/contribute.

The git repository is https://go.googlesource.com/net.

The main issue tracker for the net repository is located at https://go.dev/issues. Prefix your issue with “x/net:” in the subject line, so it is easy to find.