diff --git a/src/main/port.ts b/src/main/port.ts index 6240575ee1..f01925979f 100644 --- a/src/main/port.ts +++ b/src/main/port.ts @@ -1,14 +1,21 @@ import logger from "./logger" -import { createServer } from "net" +import { createServer, Server, IncomingMessage, ServerResponse } from "http" +import * as request from "request-promise-native" // Adapted from https://gist.github.com/mikeal/1840641#gistcomment-2896667 function checkPort(port: number) { - const server = createServer() + let server: Server = null + const checkPortHandler = (req: IncomingMessage, res: ServerResponse) => { + res.writeHead(200) + res.end("lens-port-checker") + server.close() + } + server = createServer(checkPortHandler) server.unref() return new Promise((resolve, reject) => server .on('error', error => reject(error)) - .on('listening', () => server.close(() => resolve(port))) + .on('listening', () => resolve(port)) .listen({host: "127.0.0.1", port: port})) } @@ -19,6 +26,14 @@ export async function getFreePort(firstPort: number, lastPort: number): Promise< try { logger.debug("Checking port " + port + " availability ...") await checkPort(port) + const resp = await request(`http://127.0.0.1:${port}`, { + timeout: 1000, + resolveWithFullResponse: true + }) + if (resp.body !== "lens-port-checker") { + logger.debug(`Invalid response from ${port}, probably some other process is listening on all interfaces`) + throw new Error("invalid response") + } return(port) } catch(error) { if(++port > lastPort) throw("Could not find a free port")