From cfeebfee70f21b256b388604cafce4e788236423 Mon Sep 17 00:00:00 2001 From: tbphp Date: Tue, 11 Aug 2026 19:20:39 +0800 Subject: [PATCH] =?UTF-8?q?fix(requestlog):=20=E4=BF=9D=E6=8C=81=E5=8F=82?= =?UTF-8?q?=E6=95=B0=E8=BF=BD=E8=B8=AA=E7=A9=BA=E6=95=B0=E7=BB=84=E8=BE=93?= =?UTF-8?q?=E5=87=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- internal/parametertrace/trace.go | 6 ++-- internal/parametertrace/trace_test.go | 40 +++++++++++++++++++++++++++ 2 files changed, 44 insertions(+), 2 deletions(-) diff --git a/internal/parametertrace/trace.go b/internal/parametertrace/trace.go index 7e15a53b..54a1fe5d 100644 --- a/internal/parametertrace/trace.go +++ b/internal/parametertrace/trace.go @@ -194,14 +194,16 @@ func PreflightBlocked() Trace { func CloneSnapshot(value Snapshot) Snapshot { clone := value - clone.Entries = append([]Entry(nil), value.Entries...) + clone.Entries = make([]Entry, len(value.Entries)) + copy(clone.Entries, value.Entries) return clone } func CloneTrace(value Trace) Trace { clone := value clone.Target = CloneSnapshot(value.Target) - clone.Changes = append([]Change(nil), value.Changes...) + clone.Changes = make([]Change, len(value.Changes)) + copy(clone.Changes, value.Changes) return clone } diff --git a/internal/parametertrace/trace_test.go b/internal/parametertrace/trace_test.go index 2085b407..ae0f85c6 100644 --- a/internal/parametertrace/trace_test.go +++ b/internal/parametertrace/trace_test.go @@ -246,6 +246,46 @@ func TestProjectJSONSkipsOversizeAndBoundsComplexInput(t *testing.T) { } } +func TestClonePreservesEmptySlicesForJSONArrays(t *testing.T) { + snapshot := Snapshot{ + SchemaVersion: SchemaVersion, + State: CaptureSkippedOversize, + Entries: []Entry{}, + } + clonedSnapshot := CloneSnapshot(snapshot) + if clonedSnapshot.Entries == nil { + t.Fatal("CloneSnapshot() turned empty entries into nil") + } + storedNullSnapshot := CloneSnapshot(Snapshot{ + SchemaVersion: SchemaVersion, + State: CaptureSkippedOversize, + }) + if storedNullSnapshot.Entries == nil { + t.Fatal("CloneSnapshot() did not normalize nil entries") + } + encodedSnapshot, err := MarshalSnapshot(storedNullSnapshot) + if err != nil { + t.Fatal(err) + } + if !strings.Contains(string(encodedSnapshot), `"entries":[]`) { + t.Fatalf("snapshot JSON = %s, want empty entries array", encodedSnapshot) + } + + trace := PreflightBlocked() + clonedTrace := CloneTrace(trace) + if clonedTrace.Target.Entries == nil || clonedTrace.Changes == nil { + t.Fatal("CloneTrace() turned empty slices into nil") + } + encodedTrace, err := MarshalTrace(clonedTrace) + if err != nil { + t.Fatal(err) + } + if !strings.Contains(string(encodedTrace), `"entries":[]`) || + !strings.Contains(string(encodedTrace), `"changes":[]`) { + t.Fatalf("trace JSON = %s, want empty arrays", encodedTrace) + } +} + func TestBoundTraceFitsRequestEventBudget(t *testing.T) { entries := make([]Entry, 0, 80) changes := make([]Change, 0, 80)