grpc-js: fix explicit ipv6 addresses not resolving correctly

This commit is contained in:
James Sharp 2019-11-22 12:28:57 +00:00
parent 2dce08dc99
commit ad9e53ada6
No known key found for this signature in database
GPG Key ID: AC03C8C4A12DEA31
2 changed files with 62 additions and 4 deletions

View File

@ -115,14 +115,15 @@ const dnsLookupPromise = util.promisify(dns.lookup);
function parseIP(target: string): string[] | null { function parseIP(target: string): string[] | null {
/* These three regular expressions are all mutually exclusive, so we just /* These three regular expressions are all mutually exclusive, so we just
* want the first one that matches the target string, if any do. */ * want the first one that matches the target string, if any do. */
const ipv4Match = IPV4_REGEX.exec(target);
const match = const match =
IPV4_REGEX.exec(target) || ipv4Match || IPV6_REGEX.exec(target) || IPV6_BRACKET_REGEX.exec(target);
IPV6_REGEX.exec(target) ||
IPV6_BRACKET_REGEX.exec(target);
if (match === null) { if (match === null) {
return null; return null;
} }
const addr = match[1];
// ipv6 addresses should be bracketed
const addr = ipv4Match ? match[1] : `[${match[1]}]`;
let port: string; let port: string;
if (match[2]) { if (match[2]) {
port = match[2]; port = match[2];

View File

@ -67,6 +67,63 @@ describe('Name Resolver', () => {
const resolver = resolverManager.createResolver(target, listener); const resolver = resolverManager.createResolver(target, listener);
resolver.updateResolution(); resolver.updateResolution();
}); });
it('Should correctly represent an ipv4 address', done => {
const target = '1.2.3.4';
const listener: resolverManager.ResolverListener = {
onSuccessfulResolution: (
addressList: string[],
serviceConfig: ServiceConfig | null,
serviceConfigError: StatusObject | null
) => {
assert(addressList.includes('1.2.3.4:443'));
// We would check for the IPv6 address but it needs to be omitted on some Node versions
done();
},
onError: (error: StatusObject) => {
done(new Error(`Failed with status ${error.details}`));
},
};
const resolver = resolverManager.createResolver(target, listener);
resolver.updateResolution();
});
it('Should correctly represent an ipv6 address', done => {
const target = '::1';
const listener: resolverManager.ResolverListener = {
onSuccessfulResolution: (
addressList: string[],
serviceConfig: ServiceConfig | null,
serviceConfigError: StatusObject | null
) => {
assert(addressList.includes('[::1]:443'));
// We would check for the IPv6 address but it needs to be omitted on some Node versions
done();
},
onError: (error: StatusObject) => {
done(new Error(`Failed with status ${error.details}`));
},
};
const resolver = resolverManager.createResolver(target, listener);
resolver.updateResolution();
});
it('Should correctly represent a bracketed ipv6 address', done => {
const target = '[::1]:50051';
const listener: resolverManager.ResolverListener = {
onSuccessfulResolution: (
addressList: string[],
serviceConfig: ServiceConfig | null,
serviceConfigError: StatusObject | null
) => {
assert(addressList.includes('[::1]:50051'));
// We would check for the IPv6 address but it needs to be omitted on some Node versions
done();
},
onError: (error: StatusObject) => {
done(new Error(`Failed with status ${error.details}`));
},
};
const resolver = resolverManager.createResolver(target, listener);
resolver.updateResolution();
});
it('Should resolve a public address', done => { it('Should resolve a public address', done => {
const target = 'example.com'; const target = 'example.com';
const listener: resolverManager.ResolverListener = { const listener: resolverManager.ResolverListener = {