From 3eeb93fe2102c39855b5a5b25b0f0e5d4837662a Mon Sep 17 00:00:00 2001 From: Gregor Martynus <39992+gr2m@users.noreply.github.com> Date: Wed, 22 Dec 2021 11:26:22 -0800 Subject: [PATCH 1/3] fix: handle `request.write(data, callback)` --- index.js | 6 +++++- test/record-test.js | 37 +++++++++++++++++++++++++++++++++++++ 2 files changed, 42 insertions(+), 1 deletion(-) diff --git a/index.js b/index.js index 47d2f8b..8fbbf69 100644 --- a/index.js +++ b/index.js @@ -28,8 +28,12 @@ export default { interceptedRequest[method] = function (chunk, encoding, callback) { // chunk argument may be set to the callback function, see // https://github.com/nodejs/node/blob/9e1a08057a0cd803d0878ed4b87774b5f84d6f0a/lib/_http_outgoing.js#L834-L841 + if (typeof encoding === "function") { + callback = encoding; + encoding = null; + } if (chunk && typeof chunk !== "function") { - requestBodyChunks.push(Buffer.from(chunk, encoding)); + requestBodyChunks.push(Buffer.from(chunk, encoding || "utf8")); } return originalMethod.call(this, chunk, encoding, callback); diff --git a/test/record-test.js b/test/record-test.js index 27e37db..1c8e3a4 100644 --- a/test/record-test.js +++ b/test/record-test.js @@ -143,6 +143,43 @@ test("request.write() with base64 encoding", async () => { return flowControl.promise; }); +test("request.write(data, callback)", async () => { + const recordDataControl = getFlowControl(); + const writeCallbackControl = getFlowControl(); + + const server = http.createServer(async (_request, response) => { + response.end(); + }); + const { port } = server.listen().address(); + + HttpRecorder.enable(); + HttpRecorder.on("record", async ({ requestBody }) => { + try { + assert.equal(Buffer.concat(requestBody).toString(), "Hello!"); + recordDataControl.resolve(); + } catch (error) { + recordDataControl.reject(error); + } + }); + + const request = http.request( + `http://localhost:${port}/path`, + { + method: "post", + }, + () => server.close() + ); + request.on("error", recordDataControl.reject); + request.write("Hello!", (error) => { + if (error) return writeCallbackControl.reject(error); + writeCallbackControl.resolve(); + }); + request.end(); + + await recordDataControl.promise; + await writeCallbackControl.promise; +}); + test("request.end(text)", () => { const flowControl = getFlowControl(); const server = http.createServer(async (_request, response) => { From 3c502724ea1766235e0f98b146c311077bc9b256 Mon Sep 17 00:00:00 2001 From: Gregor Martynus <39992+gr2m@users.noreply.github.com> Date: Wed, 22 Dec 2021 11:46:07 -0800 Subject: [PATCH 2/3] test: remove `response.{pause,resume}()` from "delayed response read" test --- test/record-test.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/test/record-test.js b/test/record-test.js index 1c8e3a4..67f8fd5 100644 --- a/test/record-test.js +++ b/test/record-test.js @@ -276,10 +276,10 @@ test("delayed response read", async () => { let retrievedResponseData = false; http.get(`http://localhost:${port}`, (response) => { - response.pause(); response.on("close", () => { server.close(); }); + setTimeout(() => { response.on("data", (data) => { try { @@ -290,7 +290,6 @@ test("delayed response read", async () => { responseDataControl.reject(error); } }); - response.resume(); }, 10); }); From 5d6aa7d5dd3218348f735fb7843d164438057860 Mon Sep 17 00:00:00 2001 From: Gregor Martynus <39992+gr2m@users.noreply.github.com> Date: Wed, 22 Dec 2021 11:53:31 -0800 Subject: [PATCH 3/3] test: add timeout to "delayed response read" test --- test/record-test.js | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/test/record-test.js b/test/record-test.js index 67f8fd5..5790c59 100644 --- a/test/record-test.js +++ b/test/record-test.js @@ -255,6 +255,7 @@ test("request.end(callback)", () => { test("delayed response read", async () => { const recordDataControl = getFlowControl(); const responseDataControl = getFlowControl(); + const timeoutControl = getFlowControl(); const server = http.createServer(async (_request, response) => { response.write("Hello!"); @@ -276,11 +277,13 @@ test("delayed response read", async () => { let retrievedResponseData = false; http.get(`http://localhost:${port}`, (response) => { - response.on("close", () => { - server.close(); - }); - setTimeout(() => { + response.on("close", () => { + clearTimeout(timeout); + timeoutControl.resolve(); + server.close(); + }); + response.on("data", (data) => { try { assert.equal(data.toString(), "Hello!"); @@ -293,6 +296,12 @@ test("delayed response read", async () => { }, 10); }); + const timeout = setTimeout(() => { + server.close(); + timeoutControl.reject(new Error("Timeout")); + }, 100); + + await timeoutControl.promise; await recordDataControl.promise; await responseDataControl.promise;