mirror of
https://github.com/caddyserver/caddy.git
synced 2024-12-16 21:56:40 -05:00
caddyhttp: close quic connections when server closes (#6202)
* close quic connections when server closes * fix lint * add comment about CloseGracefully
This commit is contained in:
parent
74949fb091
commit
924010cd3d
1 changed files with 24 additions and 2 deletions
|
@ -568,12 +568,30 @@ func (s *Server) serveHTTP3(addr caddy.NetworkAddress, tlsCfg *tls.Config) error
|
||||||
// create HTTP/3 server if not done already
|
// create HTTP/3 server if not done already
|
||||||
if s.h3server == nil {
|
if s.h3server == nil {
|
||||||
s.h3server = &http3.Server{
|
s.h3server = &http3.Server{
|
||||||
Handler: s,
|
// Currently when closing a http3.Server, only listeners are closed. But caddy reuses these listeners
|
||||||
|
// if possible, requests are still read and handled by the old handler. Close these connections manually.
|
||||||
|
// see issue: https://github.com/caddyserver/caddy/issues/6195
|
||||||
|
// Will interrupt ongoing requests.
|
||||||
|
// TODO: remove the handler wrap after http3.Server.CloseGracefully is implemented, see App.Stop
|
||||||
|
Handler: http.HandlerFunc(func(writer http.ResponseWriter, request *http.Request) {
|
||||||
|
select {
|
||||||
|
case <-s.ctx.Done():
|
||||||
|
if quicConn, ok := request.Context().Value(quicConnCtxKey).(quic.Connection); ok {
|
||||||
|
//nolint:errcheck
|
||||||
|
quicConn.CloseWithError(quic.ApplicationErrorCode(http3.ErrCodeRequestRejected), "")
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
s.ServeHTTP(writer, request)
|
||||||
|
}
|
||||||
|
}),
|
||||||
TLSConfig: tlsCfg,
|
TLSConfig: tlsCfg,
|
||||||
MaxHeaderBytes: s.MaxHeaderBytes,
|
MaxHeaderBytes: s.MaxHeaderBytes,
|
||||||
// TODO: remove this config when draft versions are no longer supported (we have no need to support drafts)
|
// TODO: remove this config when draft versions are no longer supported (we have no need to support drafts)
|
||||||
QuicConfig: &quic.Config{
|
QuicConfig: &quic.Config{
|
||||||
Versions: []quic.VersionNumber{quic.Version1, quic.Version2},
|
Versions: []quic.Version{quic.Version1, quic.Version2},
|
||||||
|
},
|
||||||
|
ConnContext: func(ctx context.Context, c quic.Connection) context.Context {
|
||||||
|
return context.WithValue(ctx, quicConnCtxKey, c)
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -992,6 +1010,10 @@ const (
|
||||||
// For referencing underlying net.Conn
|
// For referencing underlying net.Conn
|
||||||
ConnCtxKey caddy.CtxKey = "conn"
|
ConnCtxKey caddy.CtxKey = "conn"
|
||||||
|
|
||||||
|
// For referencing underlying quic.Connection
|
||||||
|
// TODO: export if needed later
|
||||||
|
quicConnCtxKey caddy.CtxKey = "quic_conn"
|
||||||
|
|
||||||
// For tracking whether the client is a trusted proxy
|
// For tracking whether the client is a trusted proxy
|
||||||
TrustedProxyVarKey string = "trusted_proxy"
|
TrustedProxyVarKey string = "trusted_proxy"
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue