http2/h2c: support direct hand off of h2c-upgrade connections

The initial request on an h2c-upgraded connection is written as an
HTTP/1 request, with the response sent as an HTTP/2 stream.

The h2c package handled this request by constructing a sequence of
bytes representing an HTTP/2 stream containing the initial request,
prepending those bytes to the remainder of the connection, and
presenting that to the HTTP/2 server as if no upgrade had happened.
This translation did not handle request bodies. Handling request
bodies under this model would be difficult, since it would require
also translating the HTTP/2 flow control.

Rewrite the h2c upgrade to explicitly hand off the request to the
HTTP/2 server instead.

Fixes golang/go#52882.

Change-Id: I26e0f12e2b1c8b48fd36ba47baea076424983553
Reviewed-by: Brad Fitzpatrick <>
Run-TryBot: Damien Neil <>
TryBot-Result: Gopher Robot <>
Reviewed-by: Ian Lance Taylor <>
3 files changed
tree: 97b831a66fc2cc314d969b1489f00bbe190d58e3
  1. bpf/
  2. context/
  3. dict/
  4. dns/
  5. html/
  6. http/
  7. http2/
  8. icmp/
  9. idna/
  10. internal/
  11. ipv4/
  12. ipv6/
  13. lif/
  14. nettest/
  15. netutil/
  16. proxy/
  17. publicsuffix/
  18. route/
  19. trace/
  20. webdav/
  21. websocket/
  22. xsrftoken/
  23. .gitattributes
  24. .gitignore
  26. codereview.cfg
  29. go.mod
  30. go.sum

Go Networking

Go Reference

This repository holds supplementary Go networking libraries.


The easiest way to install is to run go get -u You can also manually git clone the repository to $GOPATH/src/

Report Issues / Send Patches

This repository uses Gerrit for code changes. To learn how to submit changes to this repository, see The main issue tracker for the net repository is located at Prefix your issue with “x/net:” in the subject line, so it is easy to find.