From 0b0cb7c06f2fc534395ca3067b6c2d9aca38baa1 Mon Sep 17 00:00:00 2001 From: Marten Seemann Date: Mon, 21 Dec 2020 11:16:41 +0700 Subject: [PATCH] add a http3.Server.EnableDatagram option --- http3/server.go | 22 ++++++++++++++++++---- http3/server_test.go | 11 +++++++++++ 2 files changed, 29 insertions(+), 4 deletions(-) diff --git a/http3/server.go b/http3/server.go index 4a745d770..bd30b2dc1 100644 --- a/http3/server.go +++ b/http3/server.go @@ -89,6 +89,11 @@ type Server struct { // If nil, it uses reasonable default values. QuicConfig *quic.Config + // Enable support for HTTP/3 datagrams. + // If set to true, QuicConfig.EnableDatagram will be set. + // See https://www.ietf.org/archive/id/draft-schinazi-masque-h3-datagram-02.html. + EnableDatagrams bool + port uint32 // used atomically mutex sync.Mutex @@ -173,10 +178,19 @@ func (s *Server) serveImpl(tlsConf *tls.Config, conn net.PacketConn) error { var ln quic.EarlyListener var err error - if conn == nil { - ln, err = quicListenAddr(s.Addr, baseConf, s.QuicConfig) + quicConf := s.QuicConfig + if quicConf == nil { + quicConf = &quic.Config{} } else { - ln, err = quicListen(conn, baseConf, s.QuicConfig) + quicConf = s.QuicConfig.Clone() + } + if s.EnableDatagrams { + quicConf.EnableDatagrams = true + } + if conn == nil { + ln, err = quicListenAddr(s.Addr, baseConf, quicConf) + } else { + ln, err = quicListen(conn, baseConf, quicConf) } if err != nil { return err @@ -223,7 +237,7 @@ func (s *Server) handleConn(sess quic.EarlySession) { } buf := &bytes.Buffer{} utils.WriteVarInt(buf, streamTypeControlStream) // stream type - (&settingsFrame{}).Write(buf) + (&settingsFrame{Datagram: s.EnableDatagrams}).Write(buf) str.Write(buf.Bytes()) go s.handleUnidirectionalStreams(sess) diff --git a/http3/server_test.go b/http3/server_test.go index 0e0983ffa..89fe0ecb8 100644 --- a/http3/server_test.go +++ b/http3/server_test.go @@ -775,4 +775,15 @@ var _ = Describe("Server", func() { fullpem, privkey := testdata.GetCertificatePaths() Expect(ListenAndServeQUIC("", fullpem, privkey, nil)).To(MatchError(testErr)) }) + + It("supports H3_DATAGRAM", func() { + s.EnableDatagrams = true + var receivedConf *quic.Config + quicListenAddr = func(addr string, _ *tls.Config, config *quic.Config) (quic.EarlyListener, error) { + receivedConf = config + return nil, errors.New("listen err") + } + Expect(s.ListenAndServe()).To(HaveOccurred()) + Expect(receivedConf.EnableDatagrams).To(BeTrue()) + }) })