From 2a290317d24e4abecf3a53e41e12c75f0fcad9a2 Mon Sep 17 00:00:00 2001 From: Yoshiya Hinosawa Date: Thu, 17 Oct 2024 22:16:31 +0900 Subject: [PATCH] enable [node/http] client closing a streaming request doesn't terminate server --- tests/unit_node/http_test.ts | 144 +++++++++++++++++------------------ 1 file changed, 69 insertions(+), 75 deletions(-) diff --git a/tests/unit_node/http_test.ts b/tests/unit_node/http_test.ts index 6a1d708f5f..7d5505df81 100644 --- a/tests/unit_node/http_test.ts +++ b/tests/unit_node/http_test.ts @@ -1377,91 +1377,85 @@ Deno.test("[node/http] client closing a streaming response doesn't terminate ser clearInterval(interval!); }); -Deno.test( - "[node/http] client closing a streaming request doesn't terminate server", - { - ignore: true, - }, - async () => { - let interval: number; - let uploadedData = ""; - let requestError: Error | null = null; - const server = http.createServer((req, res) => { - res.writeHead(200, { "Content-Type": "text/plain" }); - interval = setInterval(() => { - res.write("Hello, world!\n"); - }, 100); - req.on("data", (chunk) => { - uploadedData += chunk.toString(); - }); - req.on("end", () => { - clearInterval(interval); - }); - req.on("error", (err) => { - requestError = err; - clearInterval(interval); - res.end(); - }); +Deno.test("[node/http] client closing a streaming request doesn't terminate server", async () => { + let interval: number; + let uploadedData = ""; + let requestError: Error | null = null; + const server = http.createServer((req, res) => { + res.writeHead(200, { "Content-Type": "text/plain" }); + interval = setInterval(() => { + res.write("Hello, world!\n"); + }, 100); + req.on("data", (chunk) => { + uploadedData += chunk.toString(); }); + req.on("end", () => { + clearInterval(interval); + }); + req.on("error", (err) => { + requestError = err; + clearInterval(interval); + res.end(); + }); + }); - const deferred1 = Promise.withResolvers(); - server.listen(0, () => { - // deno-lint-ignore no-explicit-any - const port = (server.address() as any).port; + const deferred1 = Promise.withResolvers(); + server.listen(0, () => { + // deno-lint-ignore no-explicit-any + const port = (server.address() as any).port; - // Create a client connection to the server - const client = net.createConnection({ port }, () => { - const headers = [ - "POST /upload HTTP/1.1", - "Host: localhost", - "Content-Type: text/plain", - "Transfer-Encoding: chunked", - "", - "", - ].join("\r\n"); + // Create a client connection to the server + const client = net.createConnection({ port }, () => { + const headers = [ + "POST /upload HTTP/1.1", + "Host: localhost", + "Content-Type: text/plain", + "Transfer-Encoding: chunked", + "", + "", + ].join("\r\n"); - client.write(headers); + client.write(headers); - const chunk = "A".repeat(100); - let sentChunks = 0; + const chunk = "A".repeat(100); + let sentChunks = 0; - function writeChunk() { - const chunkHeader = `${chunk.length.toString(16)}\r\n`; - client.write(chunkHeader); - client.write(chunk); - client.write("\r\n"); - sentChunks++; + function writeChunk() { + const chunkHeader = `${chunk.length.toString(16)}\r\n`; + client.write(chunkHeader); + client.write(chunk); + client.write("\r\n"); + sentChunks++; - if (sentChunks >= 3) { - client.destroy(); - setTimeout(() => { - deferred1.resolve(); - }, 40); - } else { - setTimeout(writeChunk, 10); - } + if (sentChunks >= 3) { + client.destroy(); + setTimeout(() => { + deferred1.resolve(); + }, 40); + } else { + setTimeout(writeChunk, 10); } - writeChunk(); - }); + } + writeChunk(); }); + }); - await deferred1.promise; - assert(requestError !== null, "Server should have received an error"); - assert( - (requestError! as Error)?.name === "Http", - `Expected Http error, got ${(requestError! as Error)?.name}`, - ); - assert( - (requestError! as Error)?.message.includes( - "error reading a body from connection", - ), - ); - assertEquals(server.listening, true); - server.close(); - assertEquals(server.listening, false); - clearInterval(interval!); - }, -); + await deferred1.promise; + assert(requestError !== null, "Server should have received an error"); + assert( + (requestError! as Error)?.name === "Http", + `Expected Http error, got ${(requestError! as Error)?.name}`, + ); + assert( + (requestError! as Error)?.message.includes( + "error reading a body from connection", + ), + ); + assertEquals(server.listening, true); + server.close(); + assertEquals(server.listening, false); + clearInterval(interval!); +}); Deno.test("[node/http] http.request() post streaming body works", async () => { const server = http.createServer((req, res) => {