Merge pull request #1199 from ortoo/master

grpc-js: fix explicit ipv6 addresses not resolving correctly
This commit is contained in:
Michael Lumish 2019-11-22 11:42:52 -08:00 committed by GitHub
commit baaa4794ef
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
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 {
/* These three regular expressions are all mutually exclusive, so we just
* want the first one that matches the target string, if any do. */
const ipv4Match = IPV4_REGEX.exec(target);
const match =
IPV4_REGEX.exec(target) ||
IPV6_REGEX.exec(target) ||
IPV6_BRACKET_REGEX.exec(target);
ipv4Match || IPV6_REGEX.exec(target) || IPV6_BRACKET_REGEX.exec(target);
if (match === null) {
return null;
}
const addr = match[1];
// ipv6 addresses should be bracketed
const addr = ipv4Match ? match[1] : `[${match[1]}]`;
let port: string;
if (match[2]) {
port = match[2];

View File

@ -67,6 +67,63 @@ describe('Name Resolver', () => {
const resolver = resolverManager.createResolver(target, listener);
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 => {
const target = 'example.com';
const listener: resolverManager.ResolverListener = {