• William Chang's avatar
    http2/h2c: add h2c implementation (unencrypted HTTP/2) · c4299a1a
    William Chang authored
    Implements 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 settins ACK.
    
    Fixes golang/go#14141
    
    Change-Id: I435f40216c883809c0dcb75426c9c59e2ea31182
    Reviewed-on: https://go-review.googlesource.com/112999Reviewed-by: 's avatarBrad Fitzpatrick <bradfitz@golang.org>
    c4299a1a
Name
Last commit
Last update
bpf Loading commit data...
context Loading commit data...
dict Loading commit data...
dns/dnsmessage Loading commit data...
html Loading commit data...
http Loading commit data...
http2 Loading commit data...
icmp Loading commit data...
idna Loading commit data...
internal Loading commit data...
ipv4 Loading commit data...
ipv6 Loading commit data...
lif Loading commit data...
nettest Loading commit data...
netutil Loading commit data...
proxy Loading commit data...
publicsuffix Loading commit data...
route Loading commit data...
trace Loading commit data...
webdav Loading commit data...
websocket Loading commit data...
xsrftoken Loading commit data...
.gitattributes Loading commit data...
.gitignore Loading commit data...
AUTHORS Loading commit data...
CONTRIBUTING.md Loading commit data...
CONTRIBUTORS Loading commit data...
LICENSE Loading commit data...
PATENTS Loading commit data...
README.md Loading commit data...
codereview.cfg Loading commit data...