mirror of
https://github.com/MeshCore-Beacon/beacon-server.git
synced 2026-10-16 20:20:07 +00:00
* feat(logging): configure levels and structured runtime output * fix(logging): bound request-derived log fields * fix(logging): retain malformed IATA source attributes safely * test(logging): capture structured REST rate-limit records
38 lines
1.1 KiB
Go
38 lines
1.1 KiB
Go
// Copyright 2026 Beacon Contributors
|
|
// SPDX-License-Identifier: AGPL-3.0-or-later
|
|
|
|
package handlers
|
|
|
|
import (
|
|
"bytes"
|
|
"encoding/json"
|
|
"log"
|
|
"log/slog"
|
|
"net/http/httptest"
|
|
"strings"
|
|
"testing"
|
|
)
|
|
|
|
func TestLimitLogOmitsRequestValues(t *testing.T) {
|
|
var out bytes.Buffer
|
|
previous, writer, flags := slog.Default(), log.Writer(), log.Flags()
|
|
slog.SetDefault(slog.New(slog.NewJSONHandler(&out, nil)))
|
|
t.Cleanup(func() { slog.SetDefault(previous); log.SetOutput(writer); log.SetFlags(flags) })
|
|
req := httptest.NewRequest("GET", "/private-path%0Aforged?limit=1000", nil)
|
|
req.RemoteAddr = "private-peer"
|
|
limit, err := parseLimit(req, 50)
|
|
if err != nil || limit != 200 {
|
|
t.Fatalf("limit=%d error=%v", limit, err)
|
|
}
|
|
if strings.Contains(out.String(), "private-") || strings.Contains(out.String(), "forged") {
|
|
t.Fatal("limit log retained request identity")
|
|
}
|
|
var record map[string]any
|
|
if err := json.Unmarshal(out.Bytes(), &record); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if record["requested_limit"] != float64(1000) || record["limit"] != float64(200) || record["component"] != "api" {
|
|
t.Fatalf("clamp diagnostics missing: %v", record)
|
|
}
|
|
}
|