Compare commits

...

2 Commits

Author SHA1 Message Date
Jarred-Sumner
e2e53b03c1 bun run prettier 2025-05-29 22:50:02 +00:00
Jarred Sumner
8ce67a22a9 test(node): add http localAddress bind error 2025-05-29 15:46:47 -07:00
2 changed files with 61 additions and 4 deletions

View File

@@ -24,6 +24,7 @@ const Duplex = require("internal/streams/duplex");
const { getDefaultHighWaterMark } = require("internal/streams/state");
const EventEmitter = require("node:events");
let dns: typeof import("node:dns");
const os = require("node:os");
const [addServerName, upgradeDuplexToTLS, isNamedPipeSocket, getBufferedAmount] = $zig(
"socket.zig",
@@ -87,6 +88,20 @@ function isIP(s): 0 | 4 | 6 {
return 0;
}
function isLocalAddress(addr: string): boolean {
if (!addr) return false;
if (addr === "0.0.0.0" || addr === "::") return true;
const interfaces = os.networkInterfaces();
for (const name in interfaces) {
const list = interfaces[name];
if (!list) continue;
for (const info of list) {
if (info && info.address === addr) return true;
}
}
return false;
}
const bunTlsSymbol = Symbol.for("::buntls::");
const bunSocketServerOptions = Symbol.for("::bunnetserveroptions::");
const owner_symbol = Symbol("owner_symbol");
@@ -1702,13 +1717,23 @@ function internalConnect(self, options, address, port, addressType, localAddress
if (localAddress || localPort) {
if (addressType === 4) {
localAddress ||= DEFAULT_IPV4_ADDR;
// TODO:
// err = self._handle.bind(localAddress, localPort);
if (!isLocalAddress(localAddress)) {
const UV_EADDRNOTAVAIL = -4090;
const ex = new ExceptionWithHostPort(UV_EADDRNOTAVAIL, "bind", localAddress, localPort);
self.destroy(ex);
return;
}
// TODO: bind socket when supported
} else {
// addressType === 6
localAddress ||= DEFAULT_IPV6_ADDR;
// TODO:
// err = self._handle.bind6(localAddress, localPort, flags);
if (!isLocalAddress(localAddress)) {
const UV_EADDRNOTAVAIL = -4090;
const ex = new ExceptionWithHostPort(UV_EADDRNOTAVAIL, "bind", localAddress, localPort);
self.destroy(ex);
return;
}
// TODO: bind6 socket when supported
}
$debug(
"connect: binding to localAddress: %s and localPort: %d (addressType: %d)",

View File

@@ -0,0 +1,32 @@
'use strict';
const common = require('../common');
const assert = require('assert');
const http = require('http');
const invalidLocalAddress = '1.2.3.4';
const server = http.createServer(function(req, res) {
console.log(`Connect from: ${req.connection.remoteAddress}`);
req.on('end', function() {
res.writeHead(200, { 'Content-Type': 'text/plain' });
res.end(`You are from: ${req.connection.remoteAddress}`);
});
req.resume();
});
server.listen(0, '127.0.0.1', common.mustCall(function() {
http.request({
host: 'localhost',
port: this.address().port,
path: '/',
method: 'GET',
localAddress: invalidLocalAddress
}, function(res) {
assert.fail('unexpectedly got response from server');
}).on('error', common.mustCall(function(e) {
console.log(`client got error: ${e.message}`);
server.close();
})).end();
}));