Skip to content

Commit

Permalink
fix: prefer IPv4 addresses when resolving domains
Browse files Browse the repository at this point in the history
Node 17+ changed the DNS resolution (see nodejs/node#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 karma-runner#3730
  • Loading branch information
devoto13 committed May 10, 2022
1 parent d35bd96 commit 84407d8
Show file tree
Hide file tree
Showing 4 changed files with 12 additions and 4 deletions.
6 changes: 5 additions & 1 deletion 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')
Expand Down Expand Up @@ -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,
Expand Down
4 changes: 3 additions & 1 deletion lib/runner.js
@@ -1,5 +1,6 @@
'use strict'

const dns = require('dns')
const http = require('http')

const constant = require('./constants')
Expand Down Expand Up @@ -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) {
Expand Down
4 changes: 3 additions & 1 deletion lib/stopper.js
@@ -1,3 +1,4 @@
const dns = require('dns')
const http = require('http')
const cfg = require('./config')
const logger = require('./logger')
Expand Down Expand Up @@ -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) {
Expand Down
2 changes: 1 addition & 1 deletion test/e2e/support/proxy.js
Expand Up @@ -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) => {
Expand Down

0 comments on commit 84407d8

Please sign in to comment.