mirror of
https://github.com/OutlineFoundation/outline-server.git
synced 2026-08-04 14:37:34 +00:00
fix(server): fix isPortUsed for IPv6 (#1238)
This commit is contained in:
parent
136809053c
commit
031ba24d7b
2 changed files with 32 additions and 13 deletions
|
|
@ -34,8 +34,9 @@ describe('PortProvider', () => {
|
|||
const ports = new get_port.PortProvider();
|
||||
const server = await listen();
|
||||
const initialPort = (server.address() as net.AddressInfo).port;
|
||||
expect(await ports.reserveFirstFreePort(initialPort)).toBeGreaterThan(initialPort);
|
||||
server.close();
|
||||
const reservedPort = await ports.reserveFirstFreePort(initialPort);
|
||||
await closeServer(server);
|
||||
expect(reservedPort).toBeGreaterThan(initialPort);
|
||||
});
|
||||
|
||||
it('respects reserved ports', async () => {
|
||||
|
|
@ -47,30 +48,42 @@ describe('PortProvider', () => {
|
|||
});
|
||||
|
||||
describe('reserveNewPort', () => {
|
||||
it('Returns a port not in use', async (done) => {
|
||||
for (let i = 0; i < 1000; ++i) {
|
||||
it('Returns a port not in use', async () => {
|
||||
// We run 100 times to try to trigger possible race conditions.
|
||||
for (let i = 0; i < 100; ++i) {
|
||||
const port = await new get_port.PortProvider().reserveNewPort();
|
||||
expect(await get_port.isPortUsed(port)).toBeFalsy();
|
||||
}
|
||||
done();
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
describe('isPortUsed', () => {
|
||||
it('Identifies a port in use', async (done) => {
|
||||
it('Identifies a port in use on IPV4', async () => {
|
||||
const port = 12345;
|
||||
const server = new net.Server();
|
||||
server.listen(port, async () => {
|
||||
expect(await get_port.isPortUsed(port)).toBeTruthy();
|
||||
server.close();
|
||||
done();
|
||||
const isPortUsed = await new Promise((resolve) => {
|
||||
server.listen(port, '127.0.0.1', () => {
|
||||
resolve(get_port.isPortUsed(port));
|
||||
});
|
||||
});
|
||||
await closeServer(server);
|
||||
expect(isPortUsed).toBeTruthy();
|
||||
});
|
||||
it('Identifies a port not in use', async (done) => {
|
||||
it('Identifies a port in use on IPV6', async () => {
|
||||
const port = 12345;
|
||||
const server = new net.Server();
|
||||
const isPortUsed = await new Promise((resolve) => {
|
||||
server.listen(port, '::1', () => {
|
||||
resolve(get_port.isPortUsed(port));
|
||||
});
|
||||
});
|
||||
await closeServer(server);
|
||||
expect(isPortUsed).toBeTruthy();
|
||||
});
|
||||
it('Identifies a port not in use', async () => {
|
||||
const port = await new get_port.PortProvider().reserveNewPort();
|
||||
expect(await get_port.isPortUsed(port)).toBeFalsy();
|
||||
done();
|
||||
});
|
||||
});
|
||||
|
||||
|
|
@ -82,3 +95,9 @@ function listen(): Promise<net.Server> {
|
|||
});
|
||||
});
|
||||
}
|
||||
|
||||
function closeServer(server: net.Server): Promise<void> {
|
||||
return new Promise((resolve, reject) => {
|
||||
server.close(err => err ? reject(err) : resolve());
|
||||
});
|
||||
}
|
||||
|
|
|
|||
|
|
@ -75,7 +75,7 @@ export function isPortUsed(port: number): Promise<boolean> {
|
|||
}
|
||||
server.close();
|
||||
});
|
||||
server.listen({host: 'localhost', port, exclusive: true}, () => {
|
||||
server.listen({port, exclusive: true}, () => {
|
||||
isUsed = false;
|
||||
server.close();
|
||||
});
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue