package echo import ( "context" "net/http" "time" "code.crute.us/mcrute/golib/log" "github.com/quic-go/quic-go/http3" ) // webServer is an interface to hide the difference between an http 1/2 // server and an http3 server. type webServer interface { LogStart(log.LeveledLogger) ListenAndServe() error Shutdown(context.Context) error } type netHttpWrapper struct { *http.Server } var _ webServer = (*netHttpWrapper)(nil) func (w *netHttpWrapper) LogStart(l log.LeveledLogger) { kind := "https" if w.TLSConfig == nil { kind = "http" } l.Infof("Starting %s server with address: %s", kind, w.Addr) } func (w *netHttpWrapper) ListenAndServe() error { if w.TLSConfig != nil { return w.Server.ListenAndServeTLS("", "") } else { return w.Server.ListenAndServe() } } type http3Wrapper struct { *http3.Server } var _ webServer = (*http3Wrapper)(nil) func (w *http3Wrapper) LogStart(l log.LeveledLogger) { l.Infof("Starting http3 server with address: %s", w.Addr) } func (w *http3Wrapper) ListenAndServe() error { return w.Serve(nil) } func (w *http3Wrapper) Shutdown(ctx context.Context) error { dl, ok := ctx.Deadline() if ok { return w.CloseGracefully(time.Until(dl)) } else { return w.CloseGracefully(1 * time.Minute) } }