mirror of
https://github.com/usebruno/bruno.git
synced 2024-11-25 09:23:17 +01:00
fix: correctly handle DNS lookup on localhost, and fallback if needed
This commit is contained in:
parent
dc39538d02
commit
5f988af6a9
@ -1,6 +1,7 @@
|
|||||||
const URL = require('url');
|
const URL = require('url');
|
||||||
const Socket = require('net').Socket;
|
const Socket = require('net').Socket;
|
||||||
const axios = require('axios');
|
const axios = require('axios');
|
||||||
|
const dnsPromises = require('dns').promises;
|
||||||
const connectionCache = new Map(); // Cache to store checkConnection() results
|
const connectionCache = new Map(); // Cache to store checkConnection() results
|
||||||
|
|
||||||
const LOCAL_IPV6 = '::1';
|
const LOCAL_IPV6 = '::1';
|
||||||
@ -32,7 +33,7 @@ const checkConnection = (host, port) =>
|
|||||||
});
|
});
|
||||||
|
|
||||||
socket.once('error', () => {
|
socket.once('error', () => {
|
||||||
connectionCache.set(key, false); // Cache failed connection
|
// we don't cache here, we want to test the connection everytime if it fails.
|
||||||
resolve(false);
|
resolve(false);
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -41,6 +42,34 @@ const checkConnection = (host, port) =>
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
const localhostLookup = (url, hostname, options, callback) => {
|
||||||
|
const port = Number(url.port) || (url.protocol.includes('https') ? 443 : 80);
|
||||||
|
|
||||||
|
dnsPromises
|
||||||
|
.lookup(hostname, options)
|
||||||
|
.then((res) => handleSuccessfulLookup(port, res, callback))
|
||||||
|
.catch(() => handleCustomLookup(port, callback));
|
||||||
|
};
|
||||||
|
|
||||||
|
const handleSuccessfulLookup = (port, res, callback) => {
|
||||||
|
/**
|
||||||
|
* If we're here it means that localhost or *.localhost resolved to an IP address inside the hosts file,
|
||||||
|
* but we still need to check connectivity, as localhost could resolve to 127.0.0.1, but a server could listen on ::1.
|
||||||
|
*/
|
||||||
|
console.log('DNS lookup successful, checking connection');
|
||||||
|
checkConnection(res.address, port).then((success) =>
|
||||||
|
success ? callback(null, res.address, res.family) : handleCustomLookup(port, callback)
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
const handleCustomLookup = (port, callback) => {
|
||||||
|
console.log(`DNS lookup failed, falling back to custom lookup.`);
|
||||||
|
checkConnection(LOCAL_IPV6, port).then((useIpv6) => {
|
||||||
|
const ip = useIpv6 ? LOCAL_IPV6 : LOCAL_IPV4;
|
||||||
|
callback(null, ip, useIpv6 ? 6 : 4);
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Function that configures axios with timing interceptors
|
* Function that configures axios with timing interceptors
|
||||||
* Important to note here that the timings are not completely accurate.
|
* Important to note here that the timings are not completely accurate.
|
||||||
@ -60,11 +89,7 @@ function makeAxiosInstance() {
|
|||||||
if (getTld(url.hostname) === LOCALHOST || url.hostname === LOCAL_IPV4 || url.hostname === LOCAL_IPV6) {
|
if (getTld(url.hostname) === LOCALHOST || url.hostname === LOCAL_IPV4 || url.hostname === LOCAL_IPV6) {
|
||||||
// use custom DNS lookup for localhost
|
// use custom DNS lookup for localhost
|
||||||
config.lookup = (hostname, options, callback) => {
|
config.lookup = (hostname, options, callback) => {
|
||||||
const portNumber = Number(url.port) || (url.protocol.includes('https') ? 443 : 80);
|
localhostLookup(url, hostname, options, callback);
|
||||||
checkConnection(LOCAL_IPV6, portNumber).then((useIpv6) => {
|
|
||||||
const ip = useIpv6 ? LOCAL_IPV6 : LOCAL_IPV4;
|
|
||||||
callback(null, ip, useIpv6 ? 6 : 4);
|
|
||||||
});
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user