From 5025fab41ac37665ad35967f1f03c16588461605 Mon Sep 17 00:00:00 2001 From: Mel Date: Sun, 29 Dec 2024 17:21:06 +0100 Subject: Simple Go HTTP server with graceful signal handling Signed-off-by: Mel --- application/pkg/specimen/handler.go | 19 +++++++++++++ application/pkg/specimen/server.go | 54 ++++++++++++++++++++++++++++++++++++ application/pkg/specimen/specimen.go | 5 ---- application/pkg/util/slog.go | 7 +++++ 4 files changed, 80 insertions(+), 5 deletions(-) create mode 100644 application/pkg/specimen/handler.go create mode 100644 application/pkg/specimen/server.go delete mode 100644 application/pkg/specimen/specimen.go create mode 100644 application/pkg/util/slog.go (limited to 'application/pkg') diff --git a/application/pkg/specimen/handler.go b/application/pkg/specimen/handler.go new file mode 100644 index 0000000..05a56ec --- /dev/null +++ b/application/pkg/specimen/handler.go @@ -0,0 +1,19 @@ +package specimen + +import ( + "log/slog" + "net/http" +) + +type requestHandler struct { + logger *slog.Logger +} + +func newRequestHandler(logger *slog.Logger) *requestHandler { + return &requestHandler{logger: logger} +} + +func (h *requestHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { + h.logger.Info("received a request!", slog.String("method", r.Method), slog.String("url", r.URL.String())) + w.WriteHeader(http.StatusOK) +} diff --git a/application/pkg/specimen/server.go b/application/pkg/specimen/server.go new file mode 100644 index 0000000..cccf6e2 --- /dev/null +++ b/application/pkg/specimen/server.go @@ -0,0 +1,54 @@ +package specimen + +import ( + "context" + "fmt" + "log/slog" + "net/http" + "time" +) + +const port = 4444 + +type Server struct { + logger *slog.Logger + server *http.Server + handler *requestHandler +} + +func NewServer(logger *slog.Logger) *Server { + handler := newRequestHandler(logger) + + return &Server{ + logger: logger, + server: &http.Server{ + Addr: fmt.Sprintf(":%d", port), + Handler: handler, + ReadTimeout: 10 * time.Second, + WriteTimeout: 10 * time.Second, + }, + } +} + +func (s *Server) Start(ctx context.Context) { + s.logger.Info("listening for incoming connections...") + err := s.server.ListenAndServe() + + switch err { + case http.ErrServerClosed: + s.logger.Info("listening has been successfully stopped.") + default: + s.logger.Error("failed to start the http server.", slog.Any("error", err)) + } +} + +func (s *Server) Shutdown(shutdownCtx context.Context) error { + s.logger.Info("shutting down the http server...") + if err := s.server.Shutdown(shutdownCtx); err != nil { + s.logger.Error("failed to shutdown the server :(", slog.Any("error", err)) + return err + } + + s.logger.Info("http server has been shutdown!") + return nil +} diff --git a/application/pkg/specimen/specimen.go b/application/pkg/specimen/specimen.go deleted file mode 100644 index 3e11364..0000000 --- a/application/pkg/specimen/specimen.go +++ /dev/null @@ -1,5 +0,0 @@ -package specimen - -func ASimpleMessage() string { - return "hi! everything is still working!! :)" -} diff --git a/application/pkg/util/slog.go b/application/pkg/util/slog.go new file mode 100644 index 0000000..ebae96f --- /dev/null +++ b/application/pkg/util/slog.go @@ -0,0 +1,7 @@ +package util + +import "log/slog" + +func SlogErr(err error) slog.Attr { + return slog.Any("error", err) +} -- cgit 1.4.1