-
Notifications
You must be signed in to change notification settings - Fork 18.4k
Description
Overview
I propose extending the x/net/http2 and net/http packages to support the extended CONNECT protocol described in RFC 8441. Support for this will be always-on in the http server, and the http client will automatically detect the presence of support based on the settings flag and adjust the checks it applies to outgoing requests to allow the for the extended CONNECT protocol. http.Request
will be extended with a new Protocol
member to allow users to set the :protocol
psudoheader.
Public Interface Changes
http.Request
will gain a new member, Protocol
of type string.
All other functionality can be achieved with existing interfaces.
Implementation
An example implementation of SETTINGS_ENABLE_CONNECT_PROTOCOL support for both the client and the server can be found on gerrit. This is just meant to be a proof of concept, not a fully production ready implementation. Rather than using a field on http.Request
it uses a magic header called HACK-HTTP2-Protocol
, but the intention is that this would be switched out for req.Protocol
for real code.
The implementation is pretty non-invasive. It consists of extending the code to allow the use of a new :protocol
psudo header, sending the new settings flag during the initial handshake, and loosening some checks when the extended CONNECT protocol is in use.
Probably the most complex thing about the implementation I was able to come up with is the fact that a CONNECT request coming from the client can now trigger a ping HTTP/2 frame if the server has not yet sent headers. This is required for an extended CONNECT to work if is the very first request on a given http2.Transport object.
Related Issues
#49918 contains some discussion about some of my initial implementation work and links to further context.
Metadata
Metadata
Assignees
Type
Projects
Status