Bound every slog line against client-chosen text (closes #176)
All checks were successful
check / check (push) Successful in 2m55s

This commit was merged in pull request #180.
This commit is contained in:
2026-08-18 06:03:10 +02:00
parent f6ec78e2c8
commit 563e834cf2
15 changed files with 1782 additions and 171 deletions

View File

@@ -9,6 +9,7 @@ import (
"time"
"github.com/go-chi/httprate"
"sneak.berlin/go/webhooker/internal/logfield"
)
const (
@@ -225,11 +226,22 @@ func (m *Middleware) clientKey(r *http.Request) string {
// rejection with logMessage and answers with responseMessage.
// httprate adds the Retry-After header (RFC 6585). The aggregate
// receiver limiter uses floodTooManyRequests instead.
//
// The path is capped against the same budget as the access log's url
// field. The per-entrypoint receiver limiter is unauthenticated and
// its path is a client-chosen segment of client-chosen length, so at
// WARN an uncapped path would let a sender pick the size of the line
// it writes — the same defect the access log capping closed.
func (m *Middleware) tooManyRequests(
logMessage, responseMessage string,
) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
m.log.Warn(logMessage, "path", r.URL.Path)
m.log.Warn(
logMessage,
"path", logfield.Truncate(
r.URL.Path, logfield.MaxBytes,
),
)
http.Error(w, responseMessage, http.StatusTooManyRequests)
}
}