diff options
Diffstat (limited to 'application/pkg')
| -rw-r--r-- | application/pkg/specimen/handler.go | 34 | ||||
| -rw-r--r-- | application/pkg/specimen/server.go | 14 |
2 files changed, 39 insertions, 9 deletions
diff --git a/application/pkg/specimen/handler.go b/application/pkg/specimen/handler.go index 05a56ec..6d4e733 100644 --- a/application/pkg/specimen/handler.go +++ b/application/pkg/specimen/handler.go @@ -1,19 +1,47 @@ package specimen import ( + "fmt" "log/slog" "net/http" ) type requestHandler struct { logger *slog.Logger + name string } -func newRequestHandler(logger *slog.Logger) *requestHandler { - return &requestHandler{logger: logger} +func newRequestHandler(logger *slog.Logger, name string) *requestHandler { + return &requestHandler{logger: logger, name: name} } 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())) + // NOTE: we could also write some logger middleware, + // but that probably would be overkill for this... + logger := h.logger.With(requestLogAttrs(r)) + logger.Info("incoming request.") + + reply := h.message() + + w.Header().Set("Content-Type", "text/plain") w.WriteHeader(http.StatusOK) + if _, err := w.Write([]byte(reply)); err != nil { + logger.Error("failed to write the response.", slog.Any("error", err)) + return + } + + logger.Info("request successfully handled.") +} + +func (h *requestHandler) message() string { + return fmt.Sprintf("hello %s", h.name) +} + +func requestLogAttrs(r *http.Request) slog.Attr { + return slog.Group( + "request", + slog.String("method", r.Method), + slog.String("url", r.URL.String()), + slog.String("remote_addr", r.RemoteAddr), + ) } diff --git a/application/pkg/specimen/server.go b/application/pkg/specimen/server.go index cccf6e2..2a222a3 100644 --- a/application/pkg/specimen/server.go +++ b/application/pkg/specimen/server.go @@ -6,23 +6,25 @@ import ( "log/slog" "net/http" "time" -) -const port = 4444 + "git.rnrd.eu/specimen/cmd/specimen/cfg" +) type Server struct { logger *slog.Logger + config cfg.Config server *http.Server handler *requestHandler } -func NewServer(logger *slog.Logger) *Server { - handler := newRequestHandler(logger) +func NewServer(logger *slog.Logger, config cfg.Config) *Server { + handler := newRequestHandler(logger, config.Name) return &Server{ logger: logger, + config: config, server: &http.Server{ - Addr: fmt.Sprintf(":%d", port), + Addr: fmt.Sprintf("%s:%d", config.Address, config.Port), Handler: handler, ReadTimeout: 10 * time.Second, WriteTimeout: 10 * time.Second, @@ -31,7 +33,7 @@ func NewServer(logger *slog.Logger) *Server { } func (s *Server) Start(ctx context.Context) { - s.logger.Info("listening for incoming connections...") + s.logger.Info("listening for incoming connections...", slog.String("address", s.server.Addr)) err := s.server.ListenAndServe() switch err { |
