this repo has no description
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

feat(log) add api middleware for requests logging

eagleusb bc9d7a02 4e007981

+45 -3
+4 -3
internal/server/server.go
··· 6 6 7 7 "github.com/eagleusb/proxycon/internal/data" 8 8 "github.com/eagleusb/proxycon/internal/handlers" 9 + "github.com/eagleusb/proxycon/internal/utility" 9 10 ) 10 11 11 12 // Server holds the HTTP server configuration. 12 13 type Server struct { 13 - serveMux *http.ServeMux 14 + handler http.Handler 14 15 } 15 16 16 17 // NewServer returns a configured HTTP server with all routes registered. ··· 18 19 mux := http.NewServeMux() 19 20 handlers.Register(mux, p, pageSize) 20 21 return &Server{ 21 - serveMux: mux, 22 + handler: utility.Logger(mux), 22 23 } 23 24 } 24 25 ··· 26 27 func (s *Server) Listen(addr string) error { 27 28 srv := &http.Server{ 28 29 Addr: addr, 29 - Handler: s.serveMux, 30 + Handler: s.handler, 30 31 Protocols: &http.Protocols{}, 31 32 } 32 33
+41
internal/utility/server.go
··· 1 + package utility 2 + 3 + import ( 4 + "log/slog" 5 + "net/http" 6 + "time" 7 + ) 8 + 9 + // Logger is an HTTP middleware that logs each request. 10 + func Logger(next http.Handler) http.Handler { 11 + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 12 + if !slog.Default().Enabled(r.Context(), slog.LevelInfo) { 13 + next.ServeHTTP(w, r) 14 + return 15 + } 16 + 17 + start := time.Now() 18 + rw := &responseWriter{ResponseWriter: w, code: http.StatusOK} 19 + next.ServeHTTP(rw, r) 20 + 21 + attrs := []slog.Attr{ 22 + slog.String("method", r.Method), 23 + slog.String("path", r.URL.Path), 24 + slog.Int("code", rw.code), 25 + slog.String("duration", time.Since(start).String()), 26 + slog.String("remote", r.RemoteAddr), 27 + } 28 + 29 + slog.LogAttrs(r.Context(), slog.LevelInfo, "http request", attrs...) 30 + }) 31 + } 32 + 33 + type responseWriter struct { 34 + http.ResponseWriter 35 + code int 36 + } 37 + 38 + func (rw *responseWriter) WriteHeader(code int) { 39 + rw.code = code 40 + rw.ResponseWriter.WriteHeader(code) 41 + }