Skip to content

Commit

Permalink
fix: log ReadableStream responses as text/json (#1622)
Browse files Browse the repository at this point in the history
Co-authored-by: Guillaume Esquevin <guillaume.esquevin@sorare.com>
Co-authored-by: Artem Zakharchenko <kettanaito@gmail.com>
  • Loading branch information
3 people committed Jun 8, 2023
1 parent 8e37d9c commit 4c7e952
Show file tree
Hide file tree
Showing 5 changed files with 21 additions and 14 deletions.
4 changes: 2 additions & 2 deletions src/setupWorker/start/createFallbackRequestListener.ts
Expand Up @@ -48,10 +48,10 @@ export function createFallbackRequestListener(
},
onMockedResponse(_, { handler, publicRequest, parsedRequest }) {
if (!options.quiet) {
context.emitter.once('response:mocked', (response) => {
context.emitter.once('response:mocked', async (response) => {
handler.log(
publicRequest,
serializeResponse(response),
await serializeResponse(response),
parsedRequest,
)
})
Expand Down
4 changes: 2 additions & 2 deletions src/setupWorker/start/createRequestListener.ts
Expand Up @@ -73,10 +73,10 @@ export const createRequestListener = (
)

if (!options.quiet) {
context.emitter.once('response:mocked', (response) => {
context.emitter.once('response:mocked', async (response) => {
handler.log(
publicRequest,
serializeResponse(response),
await serializeResponse(response),
parsedRequest,
)
})
Expand Down
4 changes: 2 additions & 2 deletions src/utils/logging/prepareResponse.test.ts
@@ -1,7 +1,7 @@
import { prepareResponse } from './prepareResponse'

test('parses a JSON response body given a "Content-Type:*/json" header', () => {
const res = prepareResponse({
test('parses a JSON response body given a "Content-Type:*/json" header', async () => {
const res = await prepareResponse({
status: 200,
statusText: 'OK',
headers: {
Expand Down
8 changes: 5 additions & 3 deletions src/utils/logging/prepareResponse.ts
Expand Up @@ -5,12 +5,14 @@ import { parseBody } from '../request/parseBody'
/**
* Formats a mocked response for introspection in the browser's console.
*/
export function prepareResponse(res: SerializedResponse<any>) {
export function prepareResponse(res: SerializedResponse<string>) {
const responseHeaders = objectToHeaders(res.headers)

// Parse a response JSON body for preview in the logs
const parsedBody = parseBody(res.body, responseHeaders)

return {
...res,
// Parse a response JSON body for preview in the logs
body: parseBody(res.body, responseHeaders),
body: parsedBody,
}
}
15 changes: 10 additions & 5 deletions src/utils/logging/serializeResponse.ts
@@ -1,11 +1,16 @@
import { flattenHeadersObject, headersToObject } from 'headers-polyfill'
import type { SerializedResponse } from '../../setupWorker/glossary'

export function serializeResponse(source: Response): SerializedResponse<any> {
export async function serializeResponse(
response: Response,
): Promise<SerializedResponse<string>> {
return {
status: source.status,
statusText: source.statusText,
headers: flattenHeadersObject(headersToObject(source.headers)),
body: source.body,
status: response.status,
statusText: response.statusText,
headers: flattenHeadersObject(headersToObject(response.headers)),
// Serialize the response body to a string
// so it's easier to process further down the chain in "prepareResponse" (browser-only)
// and "parseBody" (ambiguous).
body: await response.text(),
}
}

0 comments on commit 4c7e952

Please sign in to comment.