aboutsummaryrefslogtreecommitdiff
path: root/pkg/ext/log.go
diff options
context:
space:
mode:
authorGabriel A. Giovanini <mail@gabrielgio.me>2024-06-08 00:01:44 +0200
committerGabriel A. Giovanini <mail@gabrielgio.me>2024-06-08 00:01:44 +0200
commit6079b1d963f34ada5c4b25363f2319901e283936 (patch)
treef7f93616eb3dacfcebee486fe7542ec3adfb3950 /pkg/ext/log.go
parente9098e00fb6339b759df5b0df2e086cef8a7ce83 (diff)
downloadcerrado-6079b1d963f34ada5c4b25363f2319901e283936.tar.gz
cerrado-6079b1d963f34ada5c4b25363f2319901e283936.tar.bz2
cerrado-6079b1d963f34ada5c4b25363f2319901e283936.zip
feat: Add error handling
Diffstat (limited to 'pkg/ext/log.go')
-rw-r--r--pkg/ext/log.go53
1 files changed, 53 insertions, 0 deletions
diff --git a/pkg/ext/log.go b/pkg/ext/log.go
new file mode 100644
index 0000000..a9d26a9
--- /dev/null
+++ b/pkg/ext/log.go
@@ -0,0 +1,53 @@
+package ext
+
+import (
+ "log/slog"
+ "net/http"
+ "time"
+)
+
+type statusWraper struct {
+ statusCode int
+ innerWriter http.ResponseWriter
+}
+
+func (s *statusWraper) Header() http.Header {
+ return s.innerWriter.Header()
+}
+
+func (s *statusWraper) Write(b []byte) (int, error) {
+ return s.innerWriter.Write(b)
+}
+
+func (s *statusWraper) WriteHeader(statusCode int) {
+ s.statusCode = statusCode
+ s.innerWriter.WriteHeader(statusCode)
+}
+
+func (s *statusWraper) StatusCode() int {
+ if s.statusCode == 0 {
+ return 200
+ }
+ return s.statusCode
+}
+
+func wrap(w http.ResponseWriter) *statusWraper {
+ return &statusWraper{
+ innerWriter: w,
+ }
+}
+
+func Log(next http.HandlerFunc) http.HandlerFunc {
+ return func(w http.ResponseWriter, r *http.Request) {
+ t := time.Now()
+ s := wrap(w)
+ next(s, r)
+ slog.Info(
+ "Http request",
+ "method", r.Method,
+ "code", s.StatusCode(),
+ "path", r.URL,
+ "elapsed", time.Since(t),
+ )
+ }
+}