diff options
| -rw-r--r-- | backend/admin.go | 5 | ||||
| -rw-r--r-- | backend/data.go | 4 | ||||
| -rw-r--r-- | backend/log/logger.go (renamed from backend/logger.go) | 12 | ||||
| -rw-r--r-- | backend/router.go | 16 | ||||
| -rw-r--r-- | backend/section.go | 3 | ||||
| -rw-r--r-- | backend/storage/stats.go | 5 |
6 files changed, 30 insertions, 15 deletions
diff --git a/backend/admin.go b/backend/admin.go index 6fc61eb..89cc849 100644 --- a/backend/admin.go +++ b/backend/admin.go @@ -8,6 +8,7 @@ import ( "sync" "time" + "git.anhgelus.world/anhgelus/small-web/backend/log" "git.anhgelus.world/anhgelus/small-web/backend/storage" "github.com/go-chi/chi/v5" ) @@ -68,7 +69,7 @@ func rateLimit(ctx context.Context) bool { return false } v.since = time.Now() - GetLogger(ctx).Warn("rate limiting IP", "ip", ip, "duration", rateLimitDuration(v.n).String()) + log.GetLogger(ctx).Warn("rate limiting IP", "ip", ip, "duration", rateLimitDuration(v.n).String()) go func(v *to, ip string) { time.Sleep(3 * time.Hour) v.n = max(v.n-4, 0) @@ -106,7 +107,7 @@ func HandleAdmin(r *chi.Mux) { if rawPage != "" { page, err = strconv.Atoi(rawPage) if err != nil || page < 1 { - GetLogger(ctx).Warn("invalid page number", "requested", rawPage) + log.GetLogger(ctx).Warn("invalid page number", "requested", rawPage) http.Error(w, "Bad request", http.StatusBadRequest) return } diff --git a/backend/data.go b/backend/data.go index f7ba3b1..4f9bab1 100644 --- a/backend/data.go +++ b/backend/data.go @@ -13,6 +13,8 @@ import ( "regexp" "strings" txt "text/template" + + "git.anhgelus.world/anhgelus/small-web/backend/log" ) var ( @@ -175,7 +177,7 @@ func getAsset(ctx context.Context, path string) *assetData { return asset } asset = &assetData{} - logger := GetLogger(ctx) + logger := log.GetLogger(ctx) var b []byte if regexIsHttp.MatchString(path) { asset.Src = path diff --git a/backend/logger.go b/backend/log/logger.go index f3dbc3c..feb79fc 100644 --- a/backend/logger.go +++ b/backend/log/logger.go @@ -1,4 +1,4 @@ -package backend +package log import ( "context" @@ -35,10 +35,18 @@ func GetStatusCode(ctx context.Context) func() int { return ctx.Value(statusCode).(func() int) } +func newLogger(l *slog.Logger, r *http.Request) *slog.Logger { + return l.With("uri", r.RequestURI, "method", r.Method) +} + +func SetContextLogger(ctx context.Context, l *slog.Logger, r *http.Request) context.Context { + return context.WithValue(ctx, loggerKey, newLogger(l, r)) +} + func SetLogger(l *slog.Logger) func(http.Handler) http.Handler { return func(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - logger := l.With("uri", r.RequestURI, "method", r.Method) + logger := newLogger(l, r) ww := &customWriter{ResponseWriter: w, statusCode: http.StatusOK} ctx := context.WithValue(r.Context(), statusCode, func() int { return ww.statusCode diff --git a/backend/router.go b/backend/router.go index 6143a3f..433052b 100644 --- a/backend/router.go +++ b/backend/router.go @@ -16,6 +16,7 @@ import ( "strings" "time" + "git.anhgelus.world/anhgelus/small-web/backend/log" "git.anhgelus.world/anhgelus/small-web/backend/storage" "github.com/go-chi/chi/v5" "github.com/go-chi/chi/v5/middleware" @@ -50,7 +51,7 @@ func NewRouter(debug bool, cfg *Config, db *sql.DB, assets fs.FS) *chi.Mux { r := chi.NewRouter() r.Use(middleware.Timeout(30 * time.Second)) - r.Use(SetLogger(slog.Default())) + r.Use(log.SetLogger(slog.Default())) // security headers r.Use(func(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { @@ -86,6 +87,7 @@ func NewRouter(debug bool, cfg *Config, db *sql.DB, assets fs.FS) *chi.Mux { ctx = context.WithValue(ctx, configKey, cfg) ctx = context.WithValue(ctx, assetsFSKey, assets) ctx = context.WithValue(ctx, debugKey, debug) + ctx = log.SetContextLogger(ctx, slog.Default(), r) return context.WithValue(ctx, storage.DBKey, db) } r.Use(func(next http.Handler) http.Handler { @@ -134,13 +136,13 @@ func NewRouter(debug bool, cfg *Config, db *sql.DB, assets fs.FS) *chi.Mux { if strings.HasPrefix(r.RequestURI, "/static") || r.RequestURI == "/robots.txt" { return } - logger := GetLogger(ctx) + logger := log.GetLogger(ctx) debug := ctx.Value(debugKey).(bool) if ctx.Value(loginKey).(bool) && !debug { logger.Debug("not updating stats because user is admin logged") return } - statusCode := GetStatusCode(ctx)() + statusCode := log.GetStatusCode(ctx)() if statusCode >= 299 && r.RequestURI != storage.HumanPageLoad { logger.Debug("not updating stats for status code above 299", "status", statusCode) return @@ -155,9 +157,9 @@ func NewRouter(debug bool, cfg *Config, db *sql.DB, assets fs.FS) *chi.Mux { }) }) // anti dumb attackers bot - phpUri := regexp.MustCompile(`/.+\.php(/.*)?`) - dotUri := regexp.MustCompile(`/(.*/)*\..*`) r.Use(func(next http.Handler) http.Handler { + phpUri := regexp.MustCompile(`/.+\.php(/.*)?`) + dotUri := regexp.MustCompile(`/(.*/)*\..*`) return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { if phpUri.MatchString(r.RequestURI) || dotUri.MatchString(r.RequestURI) { handleSus(w, r) @@ -171,7 +173,7 @@ func NewRouter(debug bool, cfg *Config, db *sql.DB, assets fs.FS) *chi.Mux { r.Get("/{file:[a-z]+}.txt", func(w http.ResponseWriter, r *http.Request) { ctx := r.Context() cfg := ctx.Value(configKey).(*Config) - logger := GetLogger(ctx) + logger := log.GetLogger(ctx) logger.Info("requesting txt file", "User-Agent", r.Header.Get("User-Agent")) b, err := os.ReadFile(path.Join(cfg.PublicFolder, chi.URLParam(r, "file")+".txt")) if os.IsNotExist(err) { @@ -191,7 +193,7 @@ func NewRouter(debug bool, cfg *Config, db *sql.DB, assets fs.FS) *chi.Mux { func handleSus(w http.ResponseWriter, r *http.Request) { ctx := r.Context() - logger := GetLogger(ctx) + logger := log.GetLogger(ctx) logger.Warn("sus request", "User-Agent", r.Header.Get("User-Agent")) if rateLimit(ctx) { http.Error(w, "Too many requests", http.StatusTooManyRequests) diff --git a/backend/section.go b/backend/section.go index 2e0c520..9d49ea2 100644 --- a/backend/section.go +++ b/backend/section.go @@ -15,6 +15,7 @@ import ( "sync" "time" + "git.anhgelus.world/anhgelus/small-web/backend/log" "github.com/go-chi/chi/v5" ) @@ -270,7 +271,7 @@ func (s *Section) handlePagination(w http.ResponseWriter, r *http.Request, maxLo var err error page, err = strconv.Atoi(rawPage) if err != nil || page < 1 { - GetLogger(r.Context()).Warn("invalid page number", "requested", rawPage) + log.GetLogger(r.Context()).Warn("invalid page number", "requested", rawPage) http.Error(w, "Bad request", http.StatusBadRequest) return nil } diff --git a/backend/storage/stats.go b/backend/storage/stats.go index cdbee75..6bc9958 100644 --- a/backend/storage/stats.go +++ b/backend/storage/stats.go @@ -3,13 +3,14 @@ package storage import ( "context" "fmt" - "log/slog" "net/http" "net/url" "slices" "strings" "sync" "time" + + "git.anhgelus.world/anhgelus/small-web/backend/log" ) const IPAddressKey = "ip_address" @@ -120,7 +121,7 @@ func humanLoad(ctx context.Context, r *http.Request, domain string) error { } defer func() { if err == nil { - slog.Debug("stats updated") + log.GetLogger(ctx).Debug("stats updated") load.Remove(ip, lr.target) } }() |
