summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarvin Hagemeister <marvin@deno.com>2024-01-19 13:09:37 +0100
committerGitHub <noreply@github.com>2024-01-19 13:09:37 +0100
commit59f419bf410e861c49cdfa6c1b0e657cf8bcc8e3 (patch)
tree6312e6bf75bf2d01a2d70e9bc8d00aca4029ed94
parentc62615bfe5a070c2517f3af3208d4308c72eb054 (diff)
fix(node/http): remoteAddress and remotePort not being set (#21998)
<!-- Before submitting a PR, please read https://deno.com/manual/contributing 1. Give the PR a descriptive title. Examples of good title: - fix(std/http): Fix race condition in server - docs(console): Update docstrings - feat(doc): Handle nested reexports Examples of bad title: - fix #7123 - update docs - fix bugs 2. Ensure there is a related issue and it is referenced in the PR text. 3. Ensure there are tests that cover the changes. 4. Ensure `cargo test` passes. 5. Ensure `./tools/format.js` passes without changing files. 6. Ensure `./tools/lint.js` passes. 7. Open as a draft PR if your work is still in progress. The CI won't run all steps, but you can add '[ci]' to a commit message to force it to. 8. If you would like to run the benchmarks on the CI, add the 'ci-bench' label. --> Ultimately, it came down to using incorrect property names in the `FakeSocket` constructor. The values are passed under `remoteAddress`, not `hostname` and `remotePort` instead of `port`. Fixes https://github.com/denoland/deno/issues/21980
-rw-r--r--cli/tests/unit_node/http_test.ts24
-rw-r--r--ext/node/polyfills/http.ts12
2 files changed, 33 insertions, 3 deletions
diff --git a/cli/tests/unit_node/http_test.ts b/cli/tests/unit_node/http_test.ts
index 3573416f8..7b2012471 100644
--- a/cli/tests/unit_node/http_test.ts
+++ b/cli/tests/unit_node/http_test.ts
@@ -184,6 +184,30 @@ Deno.test("[node/http] server can respond with 101, 204, 205, 304 status", async
}
});
+Deno.test("[node/http] IncomingRequest socket has remoteAddress + remotePort", async () => {
+ const { promise, resolve } = Promise.withResolvers<void>();
+
+ let remoteAddress: string | undefined;
+ let remotePort: number | undefined;
+ const server = http.createServer((req, res) => {
+ remoteAddress = req.socket.remoteAddress;
+ remotePort = req.socket.remotePort;
+ res.end();
+ });
+ server.listen(async () => {
+ // deno-lint-ignore no-explicit-any
+ const port = (server.address() as any).port;
+ const res = await fetch(
+ `http://127.0.0.1:${port}/`,
+ );
+ await res.arrayBuffer();
+ assertEquals(remoteAddress, "127.0.0.1");
+ assertEquals(typeof remotePort, "number");
+ server.close(() => resolve());
+ });
+ await promise;
+});
+
Deno.test("[node/http] request default protocol", async () => {
const deferred1 = Promise.withResolvers<void>();
const deferred2 = Promise.withResolvers<void>();
diff --git a/ext/node/polyfills/http.ts b/ext/node/polyfills/http.ts
index 9654d3beb..2da19f7f5 100644
--- a/ext/node/polyfills/http.ts
+++ b/ext/node/polyfills/http.ts
@@ -283,10 +283,16 @@ const kError = Symbol("kError");
const kUniqueHeaders = Symbol("kUniqueHeaders");
class FakeSocket extends EventEmitter {
- constructor(opts = {}) {
+ constructor(
+ opts: {
+ encrypted?: boolean | undefined;
+ remotePort?: number | undefined;
+ remoteAddress?: string | undefined;
+ } = {},
+ ) {
super();
- this.remoteAddress = opts.hostname;
- this.remotePort = opts.port;
+ this.remoteAddress = opts.remoteAddress;
+ this.remotePort = opts.remotePort;
this.encrypted = opts.encrypted;
this.writable = true;
this.readable = true;