@marcel91200 / caddy Mirror · read-only / commits / 29452647
Fork 0

Fast and extensible multi-platform HTTP/1-2-3 web server with automatic HTTPS

Mirrored from https://github.com/Slazee/caddy.git

Synced Nov 13, 01:45 UTC

caddyhttp: Fix h3 shutdown (#5541)

* swap h3server close and listener close, avoid quic-listener not closing * fix typo

WeidiDeng committed May 20, 2023 at 00:00 UTC 29452647d803aa1259b4430b52349ce7ac1495a4
2 files changed +16 -8
modules/caddyhttp/app.go
+15 -7
@@ -594,6 +594,21 @@ func (app *App) Stop() error {
594 return
595 }
596
597 + // First close h3server then close listeners unlike stdlib for several reasons:
598 + // 1, udp has only a single socket, once closed, no more data can be read and
599 + // written. In contrast, closing tcp listeners won't affect established connections.
600 + // This have something to do with graceful shutdown when upstream implements it.
601 + // 2, h3server will only close listeners it's registered (quic listeners). Closing
602 + // listener first and these listeners maybe unregistered thus won't be closed. caddy
603 + // distinguishes quic-listener and underlying datagram sockets.
604 +
605 + // TODO: CloseGracefully, once implemented upstream (see https://github.com/quic-go/quic-go/issues/2103)
606 + if err := server.h3server.Close(); err != nil {
607 + app.logger.Error("HTTP/3 server shutdown",
608 + zap.Error(err),
609 + zap.Strings("addresses", server.Listen))
610 + }
611 +
612 // TODO: we have to manually close our listeners because quic-go won't
613 // close listeners it didn't create along with the server itself...
614 // see https://github.com/quic-go/quic-go/issues/3560
@@ -604,13 +619,6 @@ func (app *App) Stop() error {
619 zap.String("address", el.LocalAddr().String()))
620 }
621 }
607 -
608 - // TODO: CloseGracefully, once implemented upstream (see https://github.com/quic-go/quic-go/issues/2103)
609 - if err := server.h3server.Close(); err != nil {
610 - app.logger.Error("HTTP/3 server shutdown",
611 - zap.Error(err),
612 - zap.Strings("addresses", server.Listen))
613 - }
622 }
623 stopH2Listener := func(server *Server) {
624 defer finishedShutdown.Done()
modules/caddyhttp/server.go
+1 -1
@@ -555,7 +555,7 @@ func (s *Server) serveHTTP3(addr caddy.NetworkAddress, tlsCfg *tls.Config) error
555 }
556 }
557
558 - s.h3listeners = append(s.h3listeners, lnAny.(net.PacketConn))
558 + s.h3listeners = append(s.h3listeners, ln)
559
560 //nolint:errcheck
561 go s.h3server.ServeListener(h3ln)