summaryrefslogtreecommitdiff
path: root/tests/unit_node/http_test.ts
diff options
context:
space:
mode:
authorNicola Bovolato <61934734+nicolabovolato@users.noreply.github.com>2024-10-25 00:02:26 +0200
committerGitHub <noreply@github.com>2024-10-25 00:02:26 +0200
commit8dd6177c624649d75ffcacca77e7c4f48cea07a2 (patch)
tree3f9ab8859b9d76055bf2e4da17b88442bcca684d /tests/unit_node/http_test.ts
parentfd8bf0827104407dca12fa57259a0d32380adcd5 (diff)
fix(ext/node): refactor http.ServerResponse into function class (#26210)
While testing, I found out that light-my-request relies on `ServerResponse.connection`, which is deprecated, so I added that and `socket`, the non deprecated property. It also relies on an undocumented `_header` property, apparently for [raw header processing](https://github.com/fastify/light-my-request/blob/v6.1.0/lib/response.js#L180-L186). I added it as an empty string, feel free to provide other approaches. Fixes #19901 Co-authored-by: Bartek IwaƄczuk <biwanczuk@gmail.com>
Diffstat (limited to 'tests/unit_node/http_test.ts')
-rw-r--r--tests/unit_node/http_test.ts80
1 files changed, 78 insertions, 2 deletions
diff --git a/tests/unit_node/http_test.ts b/tests/unit_node/http_test.ts
index 0faf7fb34..84d6f5727 100644
--- a/tests/unit_node/http_test.ts
+++ b/tests/unit_node/http_test.ts
@@ -3,10 +3,14 @@
// deno-lint-ignore-file no-console
import EventEmitter from "node:events";
-import http, { type RequestOptions, type ServerResponse } from "node:http";
+import http, {
+ IncomingMessage,
+ type RequestOptions,
+ ServerResponse,
+} from "node:http";
import url from "node:url";
import https from "node:https";
-import net from "node:net";
+import net, { Socket } from "node:net";
import fs from "node:fs";
import { text } from "node:stream/consumers";
@@ -1704,3 +1708,75 @@ Deno.test("[node/http] upgraded socket closes when the server closed without clo
await clientSocketClosed.promise;
await serverProcessClosed.promise;
});
+
+// deno-lint-ignore require-await
+Deno.test("[node/http] ServerResponse.call()", async () => {
+ function Wrapper(this: unknown, req: IncomingMessage) {
+ ServerResponse.call(this, req);
+ }
+ Object.setPrototypeOf(Wrapper.prototype, ServerResponse.prototype);
+
+ // deno-lint-ignore no-explicit-any
+ const wrapper = new (Wrapper as any)(new IncomingMessage(new Socket()));
+
+ assert(wrapper instanceof ServerResponse);
+});
+
+Deno.test("[node/http] ServerResponse _header", async () => {
+ const { promise, resolve } = Promise.withResolvers<void>();
+ const server = http.createServer((_req, res) => {
+ assert(Object.hasOwn(res, "_header"));
+ res.end();
+ });
+
+ server.listen(async () => {
+ const { port } = server.address() as { port: number };
+ const res = await fetch(`http://localhost:${port}`);
+ await res.body?.cancel();
+ server.close(() => {
+ resolve();
+ });
+ });
+
+ await promise;
+});
+
+Deno.test("[node/http] ServerResponse connection", async () => {
+ const { promise, resolve } = Promise.withResolvers<void>();
+ const server = http.createServer((_req, res) => {
+ assert(Object.hasOwn(res, "connection"));
+ assert(res.connection instanceof Socket);
+ res.end();
+ });
+
+ server.listen(async () => {
+ const { port } = server.address() as { port: number };
+ const res = await fetch(`http://localhost:${port}`);
+ await res.body?.cancel();
+ server.close(() => {
+ resolve();
+ });
+ });
+
+ await promise;
+});
+
+Deno.test("[node/http] ServerResponse socket", async () => {
+ const { promise, resolve } = Promise.withResolvers<void>();
+ const server = http.createServer((_req, res) => {
+ assert(Object.hasOwn(res, "socket"));
+ assert(res.socket instanceof Socket);
+ res.end();
+ });
+
+ server.listen(async () => {
+ const { port } = server.address() as { port: number };
+ const res = await fetch(`http://localhost:${port}`);
+ await res.body?.cancel();
+ server.close(() => {
+ resolve();
+ });
+ });
+
+ await promise;
+});