...

Source file src/edge-infra.dev/pkg/edge/datasync/http/server.go

Documentation: edge-infra.dev/pkg/edge/datasync/http

     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  // NewServer creates a common http server with graceful shutdown to be used by all data sync http servers
    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  		// do all teardown work here...
    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