• 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
..
h2c Loading commit data...
h2demo Loading commit data...
h2i Loading commit data...
hpack Loading commit data...
testdata Loading commit data...
.gitignore Loading commit data...
Dockerfile Loading commit data...
Makefile Loading commit data...
README Loading commit data...
ciphers.go Loading commit data...
ciphers_test.go Loading commit data...
client_conn_pool.go Loading commit data...
configure_transport.go Loading commit data...
databuffer.go Loading commit data...
databuffer_test.go Loading commit data...
errors.go Loading commit data...
errors_test.go Loading commit data...
flow.go Loading commit data...
flow_test.go Loading commit data...
frame.go Loading commit data...
frame_test.go Loading commit data...
go111.go Loading commit data...
go16.go Loading commit data...
go17.go Loading commit data...
go17_not18.go Loading commit data...
go18.go Loading commit data...
go18_test.go Loading commit data...
go19.go Loading commit data...
go19_test.go Loading commit data...
gotrack.go Loading commit data...
gotrack_test.go Loading commit data...
headermap.go Loading commit data...
http2.go Loading commit data...
http2_test.go Loading commit data...
not_go111.go Loading commit data...
not_go16.go Loading commit data...
not_go17.go Loading commit data...
not_go18.go Loading commit data...
not_go19.go Loading commit data...
pipe.go Loading commit data...
pipe_test.go Loading commit data...
server.go Loading commit data...
server_push_test.go Loading commit data...
server_test.go Loading commit data...
transport.go Loading commit data...
transport_test.go Loading commit data...
write.go Loading commit data...
writesched.go Loading commit data...
writesched_priority.go Loading commit data...
writesched_priority_test.go Loading commit data...
writesched_random.go Loading commit data...
writesched_random_test.go Loading commit data...
writesched_test.go Loading commit data...
z_spec_test.go Loading commit data...