fix(network): count omitted response content promptly (#6413)

* fix(network): count omitted response content promptly

* test(network): pin response omission timing

---------

Co-authored-by: eco-null <eco-null@users.noreply.github.com>
This commit is contained in:
Canandeco-null authored and GitHub committed 2026-10-23 13:01:17 +08:00
1 parent 8b1e3143a2
commit c8d58d2e7c
2 files changed
+34 -8

No files matched your search

@@ -171,6 +171,33 @@ const bodyText = (event: BrowserScenarioEvent) => {
afterEach(() => vi.useRealTimers());
it.each(["finished", "failed", "unfinished"])(
"counts selected omitted response content when %s",
async (terminal) => {
const { collector, omittedEventCounts } = harness(
{ request_body: false, response_body: true, header_values: false },
undefined,
"fixture",
{ max_network_transactions: 1 },
);
collector.request(new RequestFixture("admitted"));
const request = new RequestFixture("omitted");
const response = new ResponseFixture(request, "response");
collector.request(request);
collector.response(response);
expect(omittedEventCounts.get("network-content")).toBe(1);
collector.response(response);
expect(omittedEventCounts.get("network-content")).toBe(1);
if (terminal === "finished") collector.finished(request);
if (terminal === "failed") collector.failed(request);
expect(omittedEventCounts.get("network-content")).toBe(1);
await collector.finish();
expect(omittedEventCounts.get("network-content")).toBe(1);
expect(response.bodyReads).toBe(0);
expect(request.bodyReads).toBe(0);
},
);
it("redacts declared secrets in browser-produced form and JSON encodings", async () => {
for (const secret of ["私密", 'space " and \n']) {
const { collector, events } = harness(selection, undefined, secret);
@@ -208,7 +208,13 @@ export class PlaywrightScenarioNetwork {
const transaction = this.transaction(request);
if (transaction === undefined) {
this.omitOmittedTransactionPhase(request, "response");
this.observeOmittedTransactionPhase(request, "response");
// Selection follows the observed response, independently of its eventual
// terminal state. No omitted response body is acquired.
if (
this.options.selection.response_body ||
this.options.selection.header_values
)
this.omitOmittedTransactionContent(request, "response");
return;
}
if (
@@ -244,13 +250,6 @@ export class PlaywrightScenarioNetwork {
const transaction = this.transaction(request);
if (transaction === undefined) {
this.omitOmittedTransactionPhase(request, "request-finished");
const observed = this.omittedPhases.get(request);
if (
observed?.has("response") &&
(this.options.selection.response_body ||
this.options.selection.header_values)
)
this.omitOmittedTransactionContent(request, "response");
return;
}
if (!this.admitMetadata(transaction, "request-finished", request)) return;