aboutsummaryrefslogtreecommitdiff
path: root/echo/internal_wrappers.go
diff options
context:
space:
mode:
Diffstat (limited to 'echo/internal_wrappers.go')
-rw-r--r--echo/internal_wrappers.go65
1 files changed, 65 insertions, 0 deletions
diff --git a/echo/internal_wrappers.go b/echo/internal_wrappers.go
new file mode 100644
index 0000000..557df02
--- /dev/null
+++ b/echo/internal_wrappers.go
@@ -0,0 +1,65 @@
1package echo
2
3import (
4 "context"
5 "net/http"
6 "time"
7
8 "code.crute.us/mcrute/golib/log"
9
10 "github.com/quic-go/quic-go/http3"
11)
12
13// webServer is an interface to hide the difference between an http 1/2
14// server and an http3 server.
15type webServer interface {
16 LogStart(log.LeveledLogger)
17 ListenAndServe() error
18 Shutdown(context.Context) error
19}
20
21type netHttpWrapper struct {
22 *http.Server
23}
24
25var _ webServer = (*netHttpWrapper)(nil)
26
27func (w *netHttpWrapper) LogStart(l log.LeveledLogger) {
28 kind := "https"
29 if w.TLSConfig == nil {
30 kind = "http"
31 }
32
33 l.Infof("Starting %s server with address: %s", kind, w.Addr)
34}
35
36func (w *netHttpWrapper) ListenAndServe() error {
37 if w.TLSConfig != nil {
38 return w.Server.ListenAndServeTLS("", "")
39 } else {
40 return w.Server.ListenAndServe()
41 }
42}
43
44type http3Wrapper struct {
45 *http3.Server
46}
47
48var _ webServer = (*http3Wrapper)(nil)
49
50func (w *http3Wrapper) LogStart(l log.LeveledLogger) {
51 l.Infof("Starting http3 server with address: %s", w.Addr)
52}
53
54func (w *http3Wrapper) ListenAndServe() error {
55 return w.Serve(nil)
56}
57
58func (w *http3Wrapper) Shutdown(ctx context.Context) error {
59 dl, ok := ctx.Deadline()
60 if ok {
61 return w.CloseGracefully(time.Until(dl))
62 } else {
63 return w.CloseGracefully(1 * time.Minute)
64 }
65}