fix: add size and duration fields to CLI bru.runRequest() response (#7429)

* fix: add size and duration fields to CLI bru.runRequest() response

Add `size` and `duration` fields to the response object in CLI to match
GUI behavior, ensuring consistent API for bru.runRequest() across both
environments.

- `duration` is an alias for `responseTime` for GUI compatibility
- `size` is the byte length of the response buffer (0 for errors/skipped)

Fixes #7352

* fix: address PR review feedback for CLI response consistency

- Coerce responseTime header to number (was string from headers.get())
- Add comment explaining duration vs responseTime difference between
  GUI (wall-clock) and CLI (approximation using responseTime)
- Add integration tests for duration/size fields across skipped,
  success, and network error response paths

* fix: add missing setupProxyAgents mock in response-fields test

The success path calls setupProxyAgents which was missing from the
proxy-util mock, causing CI failure.

---------

Co-authored-by: Chirag Chandrashekhar <cchirag85@gmail.com>
This commit is contained in:
Chirag Chandrashekhar
2026-04-02 17:55:42 +05:30
committed by GitHub
parent 7ddd2d3f17
commit 765c9f1060
2 changed files with 214 additions and 7 deletions

View File

@@ -161,7 +161,9 @@ const runSingleRequest = async function (
status: 'skipped',
statusText: errorMsg,
data: null,
responseTime: 0
responseTime: 0,
duration: 0,
size: 0
},
error: null,
status: 'skipped',
@@ -256,7 +258,9 @@ const runSingleRequest = async function (
status: 'skipped',
statusText: 'request skipped via pre-request script',
data: null,
responseTime: 0
responseTime: 0,
duration: 0,
size: 0
},
error: null,
status: 'skipped',
@@ -307,7 +311,9 @@ const runSingleRequest = async function (
headers: null,
data: null,
url: null,
responseTime: 0
responseTime: 0,
duration: 0,
size: 0
},
error: error?.message || 'An error occurred while executing the pre-request script.',
status: 'error',
@@ -667,7 +673,7 @@ const runSingleRequest = async function (
response.dataBuffer = dataBuffer;
// Prevents the duration on leaking to the actual result
responseTime = response.headers.get('request-duration');
responseTime = Number(response.headers.get('request-duration')) || 0;
response.headers.delete('request-duration');
// save cookies if enabled
@@ -707,7 +713,9 @@ const runSingleRequest = async function (
headers: null,
data: null,
url: null,
responseTime: 0
responseTime: 0,
duration: 0,
size: 0
},
error: err?.message || err?.errors?.map((e) => e?.message)?.at(0) || err?.code || 'Request Failed!',
status: 'error',
@@ -902,7 +910,11 @@ const runSingleRequest = async function (
headers: response.headers,
data: response.data,
url: response.request ? response.request.protocol + '//' + response.request.host + response.request.path : null,
responseTime
responseTime,
// In the GUI, duration is wall-clock time (timeEnd - timeStart).
// In the CLI we use responseTime as a close approximation.
duration: responseTime,
size: response.dataBuffer ? Buffer.byteLength(response.dataBuffer) : 0
},
error: null,
status: 'pass',
@@ -931,7 +943,9 @@ const runSingleRequest = async function (
headers: null,
data: null,
url: null,
responseTime: 0
responseTime: 0,
duration: 0,
size: 0
},
status: 'error',
error: err.message,