...
1 package http
2
3 import (
4 "context"
5 "fmt"
6 "net/http"
7 "time"
8
9 "github.com/go-logr/logr"
10
11 "edge-infra.dev/pkg/lib/fog"
12
13 graceful "edge-infra.dev/pkg/edge/datasync/internal/shutdown"
14 )
15
16 type Server struct {
17 server *http.Server
18 onTeardown func(ctx context.Context) error
19 shouldRun chan bool
20 logger logr.Logger
21 }
22
23
24 func NewServer(port string, handler *http.ServeMux, shouldRun chan bool) *Server {
25 newServer := &http.Server{
26 ReadHeaderTimeout: time.Minute * 1,
27 Addr: fmt.Sprintf(":%s", port),
28 Handler: handler,
29 }
30
31 logger := fog.New()
32
33 onTeardown := func(ctx context.Context) error {
34 err := newServer.Shutdown(ctx)
35
36 if err != nil {
37 logger.Error(err, "error while trying to shutdown http server")
38 return err
39 }
40
41
42
43 logger.Info("http server gracefully stopped")
44
45 return nil
46 }
47
48 return &Server{
49 server: newServer,
50 onTeardown: onTeardown,
51 shouldRun: shouldRun,
52 logger: logger,
53 }
54 }
55
56 func (s *Server) ListenAndServe() {
57 s.logger.Info("starting to listen to http requests", "address", s.server.Addr)
58
59 graceful := graceful.NewGraceful()
60
61 err := graceful.Serve(s.server.ListenAndServe, s.onTeardown)
62
63 if err != nil {
64 if err != http.ErrServerClosed {
65 s.logger.Error(err, "failed to serve http", "address", s.server.Addr)
66 }
67
68 if err == http.ErrServerClosed {
69 s.logger.Error(err, "http server was terminated", "address", s.server.Addr)
70 }
71 }
72
73 s.logger.Info("stopping http server from running", "address", s.server.Addr)
74 s.shouldRun <- false
75 }
76
View as plain text