diff --git a/.changeset/fast-snakes-move.md b/.changeset/fast-snakes-move.md new file mode 100644 index 0000000000..889042622e --- /dev/null +++ b/.changeset/fast-snakes-move.md @@ -0,0 +1,6 @@ +--- +"@redocly/respect-core": minor +"@redocly/cli": minor +--- + +Added response size to the `Respect` terminal and JSON file outputs. diff --git a/__tests__/respect/consider-severity-in-next-step-execution/__snapshots__/consider-severity-in-next-step-execution.test.ts.snap b/__tests__/respect/consider-severity-in-next-step-execution/__snapshots__/consider-severity-in-next-step-execution.test.ts.snap index b4289d841a..559196de02 100644 --- a/__tests__/respect/consider-severity-in-next-step-execution/__snapshots__/consider-severity-in-next-step-execution.test.ts.snap +++ b/__tests__/respect/consider-severity-in-next-step-execution/__snapshots__/consider-severity-in-next-step-execution.test.ts.snap @@ -16,6 +16,7 @@ exports[`should not follow the default behavior to break and return if onFailure     Response status code: 200     Response time: ms     Response Headers: +    Response Size: bytes     Response Body:       [        { @@ -90,6 +91,7 @@ exports[`should not follow the default behavior to break and return if onFailure     Response status code: 200     Response time: ms     Response Headers: +    Response Size: bytes     Response Body:       [        { @@ -228,6 +230,7 @@ exports[`should not follow the default behavior to break and return if onFailure     Response status code: 200     Response time: ms     Response Headers: +    Response Size: bytes     Response Body:       [        { diff --git a/__tests__/respect/implicit/__snapshots__/implicit.test.ts.snap b/__tests__/respect/implicit/__snapshots__/implicit.test.ts.snap index 9400461d04..8af977fc5a 100644 --- a/__tests__/respect/implicit/__snapshots__/implicit.test.ts.snap +++ b/__tests__/respect/implicit/__snapshots__/implicit.test.ts.snap @@ -32,6 +32,7 @@ exports[`should implicitly add content type header based on requestBody.content     Response status code: 204     Response time: ms     Response Headers: +    Response Size: bytes     Response Body:       {} @@ -67,6 +68,7 @@ exports[`should implicitly add content type header based on requestBody.content     Response status code: 400     Response time: ms     Response Headers: +    Response Size: bytes     Response Body:       {        "type": "http://example.com", diff --git a/__tests__/respect/inputs-passed-to-step-target-workflow-and-remapped/__snapshots__/inputs-passed-to-step-target-workflow-and-remapped.test.ts.snap b/__tests__/respect/inputs-passed-to-step-target-workflow-and-remapped/__snapshots__/inputs-passed-to-step-target-workflow-and-remapped.test.ts.snap index 5311ecf815..9c40e9eb01 100644 --- a/__tests__/respect/inputs-passed-to-step-target-workflow-and-remapped/__snapshots__/inputs-passed-to-step-target-workflow-and-remapped.test.ts.snap +++ b/__tests__/respect/inputs-passed-to-step-target-workflow-and-remapped/__snapshots__/inputs-passed-to-step-target-workflow-and-remapped.test.ts.snap @@ -35,6 +35,7 @@ exports[`should pass inputs to step target workflow with additional input parame     Response status code: 400     Response time: ms     Response Headers: +    Response Size: bytes     Response Body:       {        "type": "object", diff --git a/__tests__/respect/inputs-passed-to-step-target-workflow/__snapshots__/inputs-passed-to-step-target-workflow.test.ts.snap b/__tests__/respect/inputs-passed-to-step-target-workflow/__snapshots__/inputs-passed-to-step-target-workflow.test.ts.snap index ffb9810efb..e485c4c8e4 100644 --- a/__tests__/respect/inputs-passed-to-step-target-workflow/__snapshots__/inputs-passed-to-step-target-workflow.test.ts.snap +++ b/__tests__/respect/inputs-passed-to-step-target-workflow/__snapshots__/inputs-passed-to-step-target-workflow.test.ts.snap @@ -35,6 +35,7 @@ exports[`should pass inputs to step target workflow with additional input parame     Response status code: 201     Response time: ms     Response Headers: +    Response Size: bytes     Response Body:       {        "eventId": "dad4bce8-f5cb-4078-a211-995864315e39", diff --git a/__tests__/respect/inputs-with-cli-and-env/__snapshots__/inputs-with-cli-and-env.test.ts.snap b/__tests__/respect/inputs-with-cli-and-env/__snapshots__/inputs-with-cli-and-env.test.ts.snap index 75c56a3e8f..61839bc3a5 100644 --- a/__tests__/respect/inputs-with-cli-and-env/__snapshots__/inputs-with-cli-and-env.test.ts.snap +++ b/__tests__/respect/inputs-with-cli-and-env/__snapshots__/inputs-with-cli-and-env.test.ts.snap @@ -16,6 +16,7 @@ exports[`should use inputs from CLI and env 1`] = `     Response status code: 200     Response time: ms     Response Headers: +    Response Size: bytes     Response Body:       [        { @@ -96,6 +97,7 @@ exports[`should use inputs from CLI and env 1`] = `     Response status code: 201     Response time: ms     Response Headers: +    Response Size: bytes     Response Body:       {        "message": "Museum general entry ticket purchased", @@ -122,6 +124,7 @@ exports[`should use inputs from CLI and env 1`] = `     Response status code: 200     Response time: ms     Response Headers: +    Response Size: bytes     Response Body:       [        { @@ -211,6 +214,7 @@ exports[`should use inputs from CLI and env 1`] = `     Response status code: 201     Response time: ms     Response Headers: +    Response Size: bytes     Response Body:       {        "eventId": "dad4bce8-f5cb-4078-a211-995864315e39", diff --git a/__tests__/respect/mask-input-secrets/__snapshots__/mask-input-secrets.test.ts.snap b/__tests__/respect/mask-input-secrets/__snapshots__/mask-input-secrets.test.ts.snap index 2ca2f252cc..a767d80610 100644 --- a/__tests__/respect/mask-input-secrets/__snapshots__/mask-input-secrets.test.ts.snap +++ b/__tests__/respect/mask-input-secrets/__snapshots__/mask-input-secrets.test.ts.snap @@ -20,6 +20,7 @@ exports[`should hide sensitive input values 1`] = `     Response status code: 200     Response time: ms     Response Headers: +    Response Size: bytes     Response Body:       [        { @@ -95,6 +96,7 @@ exports[`should hide sensitive input values 1`] = `     Response status code: 200     Response time: ms     Response Headers: +    Response Size: bytes     Response Body:       [        { @@ -245,6 +247,7 @@ exports[`should hide sensitive input values 1`] = `     Response status code: 201     Response time: ms     Response Headers: +    Response Size: bytes     Response Body:       {        "eventId": "dad4bce8-f5cb-4078-a211-995864315e39", diff --git a/__tests__/respect/outputs-access-syntax-variations/__snapshots__/outputs-access-syntax-variations.test.ts.snap b/__tests__/respect/outputs-access-syntax-variations/__snapshots__/outputs-access-syntax-variations.test.ts.snap index dcc76b9c4b..674dba57c1 100644 --- a/__tests__/respect/outputs-access-syntax-variations/__snapshots__/outputs-access-syntax-variations.test.ts.snap +++ b/__tests__/respect/outputs-access-syntax-variations/__snapshots__/outputs-access-syntax-variations.test.ts.snap @@ -16,6 +16,7 @@ exports[`should resolve outputs access syntax variations 1`] = `     Response status code: 200     Response time: ms     Response Headers: +    Response Size: bytes     Response Body:       [        { @@ -96,6 +97,7 @@ exports[`should resolve outputs access syntax variations 1`] = `     Response status code: 201     Response time: ms     Response Headers: +    Response Size: bytes     Response Body:       {        "message": "Museum general entry ticket purchased", @@ -126,6 +128,7 @@ exports[`should resolve outputs access syntax variations 1`] = `     Response status code: 200     Response time: ms     Response Headers: +    Response Size: bytes     Response Body:       [        { @@ -272,6 +275,7 @@ exports[`should resolve outputs access syntax variations 1`] = `     Response status code: 201     Response time: ms     Response Headers: +    Response Size: bytes     Response Body:       {        "eventId": "dad4bce8-f5cb-4078-a211-995864315e39", @@ -306,6 +310,7 @@ exports[`should resolve outputs access syntax variations 1`] = `     Response status code: 200     Response time: ms     Response Headers: +    Response Size: bytes     Response Body:       {        "eventId": "6744a0da-4121-49cd-8479-f8cc20526495", diff --git a/__tests__/respect/replacements/__snapshots__/replacements.test.ts.snap b/__tests__/respect/replacements/__snapshots__/replacements.test.ts.snap index b2d4fdfaf6..db8547fce5 100644 --- a/__tests__/respect/replacements/__snapshots__/replacements.test.ts.snap +++ b/__tests__/respect/replacements/__snapshots__/replacements.test.ts.snap @@ -16,6 +16,7 @@ exports[`should replace values in the request body 1`] = `     Response status code: 200     Response time: ms     Response Headers: +    Response Size: bytes     Response Body:       {        "eventId": "6744a0da-4121-49cd-8479-f8cc20526495", @@ -57,6 +58,7 @@ exports[`should replace values in the request body 1`] = `     Response status code: 400     Response time: ms     Response Headers: +    Response Size: bytes     Response Body:       {        "type": "object", @@ -81,6 +83,7 @@ exports[`should replace values in the request body 1`] = `     Response status code: 400     Response time: ms     Response Headers: +    Response Size: bytes     Response Body:       {        "type": "object", @@ -105,6 +108,7 @@ exports[`should replace values in the request body 1`] = `     Response status code: 400     Response time: ms     Response Headers: +    Response Size: bytes     Response Body:       {        "type": "object", diff --git a/__tests__/respect/reusable-components/__snapshots__/reusable-components.test.ts.snap b/__tests__/respect/reusable-components/__snapshots__/reusable-components.test.ts.snap index c6bc63d828..e502794f2e 100644 --- a/__tests__/respect/reusable-components/__snapshots__/reusable-components.test.ts.snap +++ b/__tests__/respect/reusable-components/__snapshots__/reusable-components.test.ts.snap @@ -17,6 +17,7 @@ exports[`should use inputs from CLI and env to map with resolved refs 1`] = `     Response status code: 200     Response time: ms     Response Headers: +    Response Size: bytes     Response Body:       [        { @@ -88,6 +89,7 @@ exports[`should use inputs from CLI and env to map with resolved refs 1`] = `     Response status code: 200     Response time: ms     Response Headers: +    Response Size: bytes     Response Body:       [        { @@ -162,6 +164,7 @@ exports[`should use inputs from CLI and env to map with resolved refs 1`] = `     Response status code: 200     Response time: ms     Response Headers: +    Response Size: bytes     Response Body:       [        { @@ -239,6 +242,7 @@ exports[`should use inputs from CLI and env to map with resolved refs 1`] = `     Response status code: 200     Response time: ms     Response Headers: +    Response Size: bytes     Response Body:       [        { @@ -393,6 +397,7 @@ exports[`should use inputs from CLI and env to map with resolved refs 1`] = `     Response status code: 201     Response time: ms     Response Headers: +    Response Size: bytes     Response Body:       {        "eventId": "dad4bce8-f5cb-4078-a211-995864315e39", @@ -427,6 +432,7 @@ exports[`should use inputs from CLI and env to map with resolved refs 1`] = `     Response status code: 200     Response time: ms     Response Headers: +    Response Size: bytes     Response Body:       [        { diff --git a/__tests__/respect/reveal-masked-input-secrets/__snapshots__/reveal-masked-input-secrets.test.ts.snap b/__tests__/respect/reveal-masked-input-secrets/__snapshots__/reveal-masked-input-secrets.test.ts.snap index 2de9794cf1..ef0a2abb3f 100644 --- a/__tests__/respect/reveal-masked-input-secrets/__snapshots__/reveal-masked-input-secrets.test.ts.snap +++ b/__tests__/respect/reveal-masked-input-secrets/__snapshots__/reveal-masked-input-secrets.test.ts.snap @@ -20,6 +20,7 @@ exports[`should reveal masked input values 1`] = `     Response status code: 200     Response time: ms     Response Headers: +    Response Size: bytes     Response Body:       [        { @@ -95,6 +96,7 @@ exports[`should reveal masked input values 1`] = `     Response status code: 200     Response time: ms     Response Headers: +    Response Size: bytes     Response Body:       [        { @@ -245,6 +247,7 @@ exports[`should reveal masked input values 1`] = `     Response status code: 201     Response time: ms     Response Headers: +    Response Size: bytes     Response Body:       {        "eventId": "dad4bce8-f5cb-4078-a211-995864315e39", diff --git a/__tests__/respect/severity-error-level/__snapshots__/severity-error-level.test.ts.snap b/__tests__/respect/severity-error-level/__snapshots__/severity-error-level.test.ts.snap index 8f048f4a64..20b92b4990 100644 --- a/__tests__/respect/severity-error-level/__snapshots__/severity-error-level.test.ts.snap +++ b/__tests__/respect/severity-error-level/__snapshots__/severity-error-level.test.ts.snap @@ -17,6 +17,7 @@ exports[`should use error severity level 1`] = `     Response status code: 200     Response time: ms     Response Headers: +    Response Size: bytes     Response Body:       [        { @@ -101,6 +102,7 @@ exports[`should use error severity level 1`] = `     Response status code: 201     Response time: ms     Response Headers: +    Response Size: bytes     Response Body:       {        "eventId": "dad4bce8-f5cb-4078-a211-995864315e39", @@ -142,6 +144,7 @@ exports[`should use error severity level 1`] = `     Response status code: 200     Response time: ms     Response Headers: +    Response Size: bytes     Response Body:       {        "eventId": "dad4bce8-f5cb-4078-a211-995864315e39", diff --git a/__tests__/respect/severity-off-level/__snapshots__/severity-off-level.test.ts.snap b/__tests__/respect/severity-off-level/__snapshots__/severity-off-level.test.ts.snap index 4d492b7e36..5ed3303d77 100644 --- a/__tests__/respect/severity-off-level/__snapshots__/severity-off-level.test.ts.snap +++ b/__tests__/respect/severity-off-level/__snapshots__/severity-off-level.test.ts.snap @@ -17,6 +17,7 @@ exports[`should use off severity level 1`] = `     Response status code: 200     Response time: ms     Response Headers: +    Response Size: bytes     Response Body:       [        { @@ -101,6 +102,7 @@ exports[`should use off severity level 1`] = `     Response status code: 201     Response time: ms     Response Headers: +    Response Size: bytes     Response Body:       {        "eventId": "dad4bce8-f5cb-4078-a211-995864315e39", @@ -142,6 +144,7 @@ exports[`should use off severity level 1`] = `     Response status code: 200     Response time: ms     Response Headers: +    Response Size: bytes     Response Body:       {        "eventId": "dad4bce8-f5cb-4078-a211-995864315e39", diff --git a/__tests__/respect/severity-warn-level/__snapshots__/severity-warn-level.test.ts.snap b/__tests__/respect/severity-warn-level/__snapshots__/severity-warn-level.test.ts.snap index b635277316..00f91498f2 100644 --- a/__tests__/respect/severity-warn-level/__snapshots__/severity-warn-level.test.ts.snap +++ b/__tests__/respect/severity-warn-level/__snapshots__/severity-warn-level.test.ts.snap @@ -17,6 +17,7 @@ exports[`should use warn severity level 1`] = `     Response status code: 200     Response time: ms     Response Headers: +    Response Size: bytes     Response Body:       [        { @@ -101,6 +102,7 @@ exports[`should use warn severity level 1`] = `     Response status code: 201     Response time: ms     Response Headers: +    Response Size: bytes     Response Body:       {        "eventId": "dad4bce8-f5cb-4078-a211-995864315e39", @@ -142,6 +144,7 @@ exports[`should use warn severity level 1`] = `     Response status code: 200     Response time: ms     Response Headers: +    Response Size: bytes     Response Body:       {        "eventId": "dad4bce8-f5cb-4078-a211-995864315e39", diff --git a/__tests__/respect/x-security-api-key-auth/__snapshots__/x-security-api-key-auth.test.ts.snap b/__tests__/respect/x-security-api-key-auth/__snapshots__/x-security-api-key-auth.test.ts.snap index 9089b13340..7181740405 100644 --- a/__tests__/respect/x-security-api-key-auth/__snapshots__/x-security-api-key-auth.test.ts.snap +++ b/__tests__/respect/x-security-api-key-auth/__snapshots__/x-security-api-key-auth.test.ts.snap @@ -17,6 +17,7 @@ exports[`should make request with X-API-KEY in header 1`] = `     Response status code: 200     Response time: ms     Response Headers: +    Response Size: bytes     Response Body:       [        { diff --git a/__tests__/respect/x-security-basic-auth/__snapshots__/x-security-basic-auth.test.ts.snap b/__tests__/respect/x-security-basic-auth/__snapshots__/x-security-basic-auth.test.ts.snap index beadd89c12..17c86c16aa 100644 --- a/__tests__/respect/x-security-basic-auth/__snapshots__/x-security-basic-auth.test.ts.snap +++ b/__tests__/respect/x-security-basic-auth/__snapshots__/x-security-basic-auth.test.ts.snap @@ -16,6 +16,7 @@ exports[`should make request with Authorization header \`Basic ...\` 1`] = `     Response status code: 200     Response time: ms     Response Headers: +    Response Size: bytes     Response Body:       [        { diff --git a/__tests__/respect/x-security-bearer-auth/__snapshots__/x-security-bearer-auth.test.ts.snap b/__tests__/respect/x-security-bearer-auth/__snapshots__/x-security-bearer-auth.test.ts.snap index cdf06bc2b0..4eb24a4134 100644 --- a/__tests__/respect/x-security-bearer-auth/__snapshots__/x-security-bearer-auth.test.ts.snap +++ b/__tests__/respect/x-security-bearer-auth/__snapshots__/x-security-bearer-auth.test.ts.snap @@ -16,6 +16,7 @@ exports[`should make request with Authorization header \`Bearer ...\` 1`] = `     Response status code: 200     Response time: ms     Response Headers: +    Response Size: bytes     Response Body:       [        { diff --git a/__tests__/respect/x-security-oauth2-auth/__snapshots__/x-security-oauth2-auth.test.ts.snap b/__tests__/respect/x-security-oauth2-auth/__snapshots__/x-security-oauth2-auth.test.ts.snap index ecd7a3ed57..a0f27c6e42 100644 --- a/__tests__/respect/x-security-oauth2-auth/__snapshots__/x-security-oauth2-auth.test.ts.snap +++ b/__tests__/respect/x-security-oauth2-auth/__snapshots__/x-security-oauth2-auth.test.ts.snap @@ -16,6 +16,7 @@ exports[`should make request with Authorization header \`Bearer ...\` using OAut     Response status code: 200     Response time: ms     Response Headers: +    Response Size: bytes     Response Body:       [        { diff --git a/__tests__/respect/x-security-on-workflow-level-merged-to-steps/__snapshots__/x-security-on-workflow-level-merged-to-steps.test.ts.snap b/__tests__/respect/x-security-on-workflow-level-merged-to-steps/__snapshots__/x-security-on-workflow-level-merged-to-steps.test.ts.snap index 909e541b30..27953b05fe 100644 --- a/__tests__/respect/x-security-on-workflow-level-merged-to-steps/__snapshots__/x-security-on-workflow-level-merged-to-steps.test.ts.snap +++ b/__tests__/respect/x-security-on-workflow-level-merged-to-steps/__snapshots__/x-security-on-workflow-level-merged-to-steps.test.ts.snap @@ -16,6 +16,7 @@ exports[`should merge x-security schemes on workflow level to steps 1`] = `     Response status code: 200     Response time: ms     Response Headers: +    Response Size: bytes     Response Body:       [        { @@ -97,6 +98,7 @@ exports[`should merge x-security schemes on workflow level to steps 1`] = `     Response status code: 201     Response time: ms     Response Headers: +    Response Size: bytes     Response Body:       {        "eventId": "dad4bce8-f5cb-4078-a211-995864315e39", diff --git a/__tests__/respect/x-security-open-id-connect-auth/__snapshots__/x-security-open-id-connect-auth.test.ts.snap b/__tests__/respect/x-security-open-id-connect-auth/__snapshots__/x-security-open-id-connect-auth.test.ts.snap index 77dc9b2376..c5cf7f86b1 100644 --- a/__tests__/respect/x-security-open-id-connect-auth/__snapshots__/x-security-open-id-connect-auth.test.ts.snap +++ b/__tests__/respect/x-security-open-id-connect-auth/__snapshots__/x-security-open-id-connect-auth.test.ts.snap @@ -16,6 +16,7 @@ exports[`should make request with Authorization header \`Bearer ...\` using Open     Response status code: 200     Response time: ms     Response Headers: +    Response Size: bytes     Response Body:       [        { diff --git a/__tests__/respect/x-security-resolve-scheme-name/__snapshots__/x-security-resolve-scheme-name.test.ts.snap b/__tests__/respect/x-security-resolve-scheme-name/__snapshots__/x-security-resolve-scheme-name.test.ts.snap index f5c3171e7f..876be8063d 100644 --- a/__tests__/respect/x-security-resolve-scheme-name/__snapshots__/x-security-resolve-scheme-name.test.ts.snap +++ b/__tests__/respect/x-security-resolve-scheme-name/__snapshots__/x-security-resolve-scheme-name.test.ts.snap @@ -16,6 +16,7 @@ exports[`should resolve securitySchemes described in x-security by schemeName 1`     Response status code: 200     Response time: ms     Response Headers: +    Response Size: bytes     Response Body:       [        { @@ -85,6 +86,7 @@ exports[`should resolve securitySchemes described in x-security by schemeName 1`     Response status code: 200     Response time: ms     Response Headers: +    Response Size: bytes     Response Body:       [        { diff --git a/__tests__/respect/x-security-scheme-apply-order/__snapshots__/x-security-scheme-apply-order.test.ts.snap b/__tests__/respect/x-security-scheme-apply-order/__snapshots__/x-security-scheme-apply-order.test.ts.snap index 1b4ed01655..d284bb05a5 100644 --- a/__tests__/respect/x-security-scheme-apply-order/__snapshots__/x-security-scheme-apply-order.test.ts.snap +++ b/__tests__/respect/x-security-scheme-apply-order/__snapshots__/x-security-scheme-apply-order.test.ts.snap @@ -18,6 +18,7 @@ exports[`should apply x-security schemes in Top-Down order, the Last one have bi     Response status code: 200     Response time: ms     Response Headers: +    Response Size: bytes     Response Body:       [        { diff --git a/packages/cli/src/commands/respect/json-logs.ts b/packages/cli/src/commands/respect/json-logs.ts index 383b1fce05..a09b207a61 100644 --- a/packages/cli/src/commands/respect/json-logs.ts +++ b/packages/cli/src/commands/respect/json-logs.ts @@ -89,6 +89,7 @@ function mapJsonStep( body: publicStep.response?.body, headers: step.response?.header || {}, time: step.response?.time || 0, + size: step.response?.responseSize, }, checks: step.checks.map((check) => ({ ...check, diff --git a/packages/respect-core/src/modules/logger-output/display-checks.ts b/packages/respect-core/src/modules/logger-output/display-checks.ts index 37a5e204c9..a49c60073e 100644 --- a/packages/respect-core/src/modules/logger-output/display-checks.ts +++ b/packages/respect-core/src/modules/logger-output/display-checks.ts @@ -74,6 +74,7 @@ function displayVerboseLogs({ }): string { const { path, host, headerParams, body, statusCode } = logs; const responseTime = !isBrowser && process.env.NODE_ENV === 'test' ? '' : logs.responseTime; + const responseSize = !isBrowser && process.env.NODE_ENV === 'test' ? '' : logs.responseSize; const urlString = indent(`Request URL: ${blue(combineUrl(host, path))}`, 4); const requestHeadersString = indent(`Request Headers:`, 4); @@ -131,6 +132,7 @@ function displayVerboseLogs({ !isBrowser && process.env.NODE_ENV === 'test' ? gray(indent('Response Headers: ', 4)) : headersString && gray(responseHeadersString) + '\n' + gray(headersString), + responseSize && gray(indent('Response Size: ' + blue(responseSize as number), 4) + ' bytes'), body && gray(responseBodyString), body && bodyString, ] diff --git a/packages/respect-core/src/modules/logger-output/verbose-logs.ts b/packages/respect-core/src/modules/logger-output/verbose-logs.ts index 2842cb422b..a01ee08217 100644 --- a/packages/respect-core/src/modules/logger-output/verbose-logs.ts +++ b/packages/respect-core/src/modules/logger-output/verbose-logs.ts @@ -8,6 +8,7 @@ export function getVerboseLogs({ body, statusCode, responseTime, + responseSize, }: VerboseLog): VerboseLog { const verboseLogs: VerboseLog = { path, @@ -36,5 +37,9 @@ export function getVerboseLogs({ verboseLogs.responseTime = responseTime; } + if (responseSize !== undefined) { + verboseLogs.responseSize = responseSize; + } + return verboseLogs; } diff --git a/packages/respect-core/src/types.ts b/packages/respect-core/src/types.ts index 699c376c3c..d73539516f 100644 --- a/packages/respect-core/src/types.ts +++ b/packages/respect-core/src/types.ts @@ -73,6 +73,7 @@ export type VerboseLog = { headerParams?: Record; statusCode?: number; responseTime?: number; + responseSize?: number; }; type AdditionalStepProps = { verboseLog?: VerboseLog; @@ -238,6 +239,7 @@ export interface StepExecutionResult { body: any; headers: Record; time: number; + size: number | undefined; }; checks: (Check & { status: ExecutionStatus })[]; } diff --git a/packages/respect-core/src/utils/api-fetcher.ts b/packages/respect-core/src/utils/api-fetcher.ts index 96c50b9da1..fe1deb6ded 100644 --- a/packages/respect-core/src/utils/api-fetcher.ts +++ b/packages/respect-core/src/utils/api-fetcher.ts @@ -100,6 +100,7 @@ export class ApiFetcher implements IFetcher { body, statusCode, responseTime, + responseSize, }: VerboseLog) => { this.verboseResponseLogs = getVerboseLogs({ headerParams, @@ -109,6 +110,7 @@ export class ApiFetcher implements IFetcher { body, statusCode, responseTime, + responseSize, }); }; @@ -316,6 +318,7 @@ export class ApiFetcher implements IFetcher { path: pathWithSearchParams || '', statusCode: first401Result.status, responseTime: 0, + responseSize: undefined, }); throw new StatusCodeError( `Digest auth failed, expected 401 status code, but received ${first401Result.status} in the first response` @@ -330,6 +333,7 @@ export class ApiFetcher implements IFetcher { path: pathWithSearchParams || '', statusCode: first401Result.status, responseTime: 0, + responseSize: undefined, }); throw new UnexpectedError( 'Digest auth failed, no www-authenticate header received in the first response' @@ -435,6 +439,21 @@ export class ApiFetcher implements IFetcher { ctx.secretsSet.add(secretItem); } + let responseSize: number | undefined; + const contentLength = fetchResult.headers.get('content-length'); + + if (contentLength && !isNaN(+contentLength)) { + responseSize = +contentLength; + } else { + if (responseBody instanceof ArrayBuffer) { + responseSize = responseBody.byteLength; + } else if (typeof responseBody === 'string') { + responseSize = new TextEncoder().encode(responseBody).length; + } else { + responseSize = undefined; + } + } + this.initVerboseResponseLogs({ body: isJsonContentType(responseContentType) ? JSON.stringify(maskedResponseBody) @@ -449,6 +468,7 @@ export class ApiFetcher implements IFetcher { noSecretsMasking: ctx.noSecretsMasking, secretsSet: ctx.secretsSet, }), + responseSize, }); return { @@ -458,6 +478,7 @@ export class ApiFetcher implements IFetcher { header: Object.fromEntries(fetchResult.headers?.entries() || []), contentType: responseContentType, requestUrl: urlToFetch, + responseSize, }; }; }