Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add implementation of h2c into x/net/http2/h2c. #25363

Closed
misterwilliam opened this issue May 13, 2018 · 4 comments
Closed

Add implementation of h2c into x/net/http2/h2c. #25363

misterwilliam opened this issue May 13, 2018 · 4 comments

Comments

@misterwilliam
Copy link

misterwilliam commented May 13, 2018

I would like to add an implementation of h2c into x/net/http2/h2c.

The proposed implementation strategy is to implement h2c by leveraging the existing http2.Server by implementing the 2 ways to start an h2c connection as described in RFC 7540, which are: (1)
create a connection starting with HTTP/1 and then upgrading to h2c [Section 3.2] and (2) starting a connection directly speaking h2c (aka starting with prior knowledge) [Section 3.4].

For both of the above connection methods the implementation strategy is to hijack a HTTP/1 connection, perform the h2c connection on the hijacked net.Conn, and create a suitably configured net.Conn to pass into http2.Server.ServeConn.

For h2c with prior knowledge this is relatively simple. For that we just have to verify the HTTP/2 client preface has been written to the net.Conn, and then reforward the client preface to the hijacked connection.

For h2c upgraded from HTTP/1, this is a bit more involved. First we validate the HTTP/1 Upgrade request, and respond to the client with 101 Switching Protocols. Then we write a HTTP/2 client preface on behalf of the client, and a settings frame and a headers frame which correspond to what was in
the upgrade request. Then since http2.Server is going respond with a settings ACK, we swallow it so that it is not forwarded to the client since for h2c upgrade from HTTP/1 the 101 Switching Protocols response replaces the settings ACK.

I have a working example of this strategy submitted to gerrit as: 112997

The code I have will obviously need some work before submission, but I think I am far enough that I would like to start the conversation on what the next steps should be. (This is my first time trying to contribute, so I'm a little confused what the process is. I am under the impression that I should get some feedback on my proposal before trying to produce the final solution.)

@gopherbot
Copy link
Contributor

Change https://golang.org/cl/112997 mentions this issue: Add implementation of h2c into x/net/http2/h2c.

@odeke-em
Copy link
Member

/cc @tombergan @bradfitz

@agnivade
Copy link
Contributor

Seems like a straight dupe of #14141. Any reason this needs to be opened as a new issue again ?

@bradfitz
Copy link
Contributor

Duplicate of #14141 (magic phrase for GitHub)

Yes, let's use #14141 instead.

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Projects
None yet
Development

No branches or pull requests

5 participants