allow 0-RTT in HTTP/0.9 client and server

This commit is contained in:
Marten Seemann
2020-01-29 15:37:59 +07:00
parent ce64c6b301
commit 61309896b8
3 changed files with 14 additions and 7 deletions

View File

@@ -15,6 +15,10 @@ import (
"github.com/lucas-clemente/quic-go"
)
// MethodGet0RTT allows a GET request to be sent using 0-RTT.
// Note that 0-RTT data doesn't provide replay protection.
const MethodGet0RTT = "GET_0RTT"
// RoundTripper performs HTTP/0.9 roundtrips over QUIC.
type RoundTripper struct {
mutex sync.Mutex
@@ -30,7 +34,7 @@ var _ http.RoundTripper = &RoundTripper{}
// RoundTrip performs a HTTP/0.9 request.
// It only supports GET requests.
func (r *RoundTripper) RoundTrip(req *http.Request) (*http.Response, error) {
if req.Method != http.MethodGet {
if req.Method != http.MethodGet && req.Method != MethodGet0RTT {
return nil, errors.New("only GET requests supported")
}
@@ -76,17 +80,20 @@ type client struct {
quicConf *quic.Config
once sync.Once
sess quic.Session
sess quic.EarlySession
dialErr error
}
func (c *client) RoundTrip(req *http.Request) (*http.Response, error) {
c.once.Do(func() {
c.sess, c.dialErr = quic.DialAddr(c.hostname, c.tlsConf, c.quicConf)
c.sess, c.dialErr = quic.DialAddrEarly(c.hostname, c.tlsConf, c.quicConf)
})
if c.dialErr != nil {
return nil, c.dialErr
}
if req.Method != MethodGet0RTT {
<-c.sess.HandshakeComplete().Done()
}
return c.doRequest(req)
}

View File

@@ -36,8 +36,8 @@ var _ = Describe("HTTP 0.9 integration tests", func() {
defer close(done)
_ = server.ListenAndServe()
}()
var ln quic.Listener
Eventually(func() quic.Listener {
var ln quic.EarlyListener
Eventually(func() quic.EarlyListener {
server.mutex.Lock()
defer server.mutex.Unlock()
ln = server.listener

View File

@@ -41,7 +41,7 @@ type Server struct {
QuicConfig *quic.Config
mutex sync.Mutex
listener quic.Listener
listener quic.EarlyListener
}
// Close closes the server.
@@ -69,7 +69,7 @@ func (s *Server) ListenAndServe() error {
tlsConf := s.TLSConfig.Clone()
tlsConf.NextProtos = []string{h09alpn}
ln, err := quic.Listen(conn, tlsConf, s.QuicConfig)
ln, err := quic.ListenEarly(conn, tlsConf, s.QuicConfig)
if err != nil {
return err
}