From 84407d850db39c42ad05f16993719a67c711a882 Mon Sep 17 00:00:00 2001 From: Yaroslav Admin Date: Tue, 10 May 2022 20:35:56 +0200 Subject: [PATCH] fix: prefer IPv4 addresses when resolving domains Node 17+ changed the DNS resolution (see https://github.com/nodejs/node/issues/40702), so now it resolves `localhost` according to the OS settings instead of IPv4-address first. The Karma server only listens on IPv4 address (127.0.0.1) by default, but the requests are sent to `localhost` in several places and `localhost` is resolved into IPv6 address (`::`) in Node 17+. So the run/stop/proxy request is unable to reach the Karma server and produces an error. This commit configures karma to use the IPv4-address first approach in newer Node version as well. In the future major release, we may consider changing defaults to listen on IPv6 address instead, but IPv6 is not supported in Docker on macOS and Windows, so I think we should not rush such a change to make sure karma works there out of the box. Fixes #3730 --- lib/middleware/proxy.js | 6 +++++- lib/runner.js | 4 +++- lib/stopper.js | 4 +++- test/e2e/support/proxy.js | 2 +- 4 files changed, 12 insertions(+), 4 deletions(-) diff --git a/lib/middleware/proxy.js b/lib/middleware/proxy.js index 6b0fcf730..6d0ef1a7a 100644 --- a/lib/middleware/proxy.js +++ b/lib/middleware/proxy.js @@ -1,3 +1,4 @@ +const dns = require('dns') const url = require('url') const { Agent: httpAgent } = require('http') const { Agent: httpsAgent } = require('https') @@ -41,7 +42,10 @@ function parseProxyConfig (proxies, config) { const port = proxyDetails.port || defaultPorts[proxyDetails.protocol] || config.port const changeOrigin = proxyConfiguration.changeOrigin || false const Agent = protocol === 'https:' ? httpsAgent : httpAgent - const agent = new Agent({ keepAlive: true }) + const agent = new Agent({ + keepAlive: true, + lookup: (hostname, options, callback) => dns.lookup(hostname, { ...options, verbatim: false }, callback) + }) const proxy = httpProxy.createProxyServer({ target: { host: hostname, port, protocol }, xfwd: true, diff --git a/lib/runner.js b/lib/runner.js index 2e04065b6..ede05d48e 100644 --- a/lib/runner.js +++ b/lib/runner.js @@ -1,5 +1,6 @@ 'use strict' +const dns = require('dns') const http = require('http') const constant = require('./constants') @@ -74,7 +75,8 @@ function run (cliOptionsOrConfig, done) { method: 'POST', headers: { 'Content-Type': 'application/json' - } + }, + lookup: (hostname, options, callback) => dns.lookup(hostname, { ...options, verbatim: false }, callback) } const request = http.request(options, function (response) { diff --git a/lib/stopper.js b/lib/stopper.js index 964eb5e37..8076178fa 100644 --- a/lib/stopper.js +++ b/lib/stopper.js @@ -1,3 +1,4 @@ +const dns = require('dns') const http = require('http') const cfg = require('./config') const logger = require('./logger') @@ -42,7 +43,8 @@ exports.stop = function (cliOptionsOrConfig, done) { hostname: config.hostname, path: config.urlRoot + 'stop', port: config.port, - method: 'GET' + method: 'GET', + lookup: (hostname, options, callback) => dns.lookup(hostname, { ...options, verbatim: false }, callback) }) request.on('response', function (response) { diff --git a/test/e2e/support/proxy.js b/test/e2e/support/proxy.js index 5bf17c1fd..e78a4544c 100644 --- a/test/e2e/support/proxy.js +++ b/test/e2e/support/proxy.js @@ -8,7 +8,7 @@ module.exports = class Proxy { this.proxyPathRegExp = null this.proxy = httpProxy.createProxyServer({ - target: 'http://localhost:9876' + target: 'http://127.0.0.1:9876' }) this.proxy.on('error', (err) => {