diff --git a/index.js b/index.js index 1d67f6f..47d2f8b 100644 --- a/index.js +++ b/index.js @@ -39,16 +39,18 @@ export default { interceptedRequest.on("response", async (response) => { // read the response body as an array of Buffer chuncks const responseBodyChunks = []; - for await (const chunk of response) { + response.on("data", (chunk) => { responseBodyChunks.push(Buffer.from(chunk)); - } + }); - // emit the `request` event with the request and response body - emitter.emit("record", { - request: interceptedRequest, - requestBody: requestBodyChunks, - response, - responseBody: responseBodyChunks, + response.on("close", () => { + // emit the `request` event with the request and response body + emitter.emit("record", { + request: interceptedRequest, + requestBody: requestBodyChunks, + response, + responseBody: responseBodyChunks, + }); }); }); diff --git a/test/index.js b/test/index.js index cf9b03f..02df9fa 100644 --- a/test/index.js +++ b/test/index.js @@ -201,6 +201,72 @@ test("request.end(callback)", () => { }); }); +test("delayed response read", () => { + return new Promise((resolve, reject) => { + const server = http.createServer(async (_request, response) => { + response.write("Hello!"); + response.end(); + }); + const { port } = server.listen().address(); + + HttpRecorder.enable(); + HttpRecorder.on("record", async ({ responseBody }) => { + try { + assert.equal(Buffer.concat(responseBody).toString(), "Hello!"); + assert.ok(retrievedData); + resolve(); + } catch (error) { + reject(error); + } + }); + + let retrievedData = false; + http.get(`http://localhost:${port}`, (response) => { + response.pause(); + response.on("close", () => { + server.close(); + }); + setTimeout(() => { + response.on("data", (data) => { + assert.equal(data.toString(), "Hello!"); + retrievedData = true; + }); + response.resume(); + }, 100); + }); + }); +}); + +test("response.end(text)", () => { + return new Promise((resolve, reject) => { + const server = http.createServer(async (_request, response) => { + response.end("Hello!"); + }); + const { port } = server.listen().address(); + + HttpRecorder.enable(); + let retrievedData = false; + HttpRecorder.on("record", async ({ responseBody }) => { + try { + assert.equal(Buffer.concat(responseBody).toString(), "Hello!"); + retrievedData = true; + server.close(); + resolve(); + } catch (error) { + reject(error); + } + }); + + http.get(`http://localhost:${port}`, async (response) => { + response.resume(); + for await (const chunk of response) { + assert.equal(chunk.toString(), "Hello!"); + } + assert.ok(retrievedData); + }); + }); +}); + test("https", () => { return new Promise((resolve, reject) => { const __dirname = path.dirname(url.fileURLToPath(import.meta.url));