From c536178c675aa3527aa8cd366a274009ed7a050c Mon Sep 17 00:00:00 2001 From: WK Date: Sat, 29 Aug 2020 19:05:42 +0800 Subject: [PATCH 1/7] Fixed connectivity to Google PubSub over proxy Latest version has caused @google-cloud/pubsub fail to connect over a proxy connection. Snapshot of error: 2020-08-29T10:52:45.340Z | proxy | Successfully connected to pubsub.googleapis.c om:443 through proxy 172.16.52.252:443 2020-08-29T10:52:45.370Z | subchannel | 172.16.52.252:443 CONNECTING -> TRANSIEN T_FAILURE 2020-08-29T10:52:45.372Z | pick_first | CONNECTING -> TRANSIENT_FAILURE 2020-08-29T10:52:45.373Z | resolving_load_balancer | dns:172.16.52.252:443 CONNE CTING -> TRANSIENT_FAILURE 2020-08-29T10:52:45.375Z | channel | Pick result: TRANSIENT_FAILURE subchannel: undefined status: 14 No connection established 2020-08-29T10:52:45.377Z | call_stream | [11] cancelWithStatus code: 14 details: "No connection established" 2020-08-29T10:52:45.379Z | call_stream | [11] ended with status: code=14 details ="No connection established" 2020-08-29T10:52:45.381Z | connectivity_state | dns:172.16.52.252:443 CONNECTING -> TRANSIENT_FAILURE Before proposed fix: static getDefaultAuthority(target) { return target.path; // this returns "pubsub.googleapis.com:443" } After proposed fix: static getDefaultAuthority(target) { const hostPort = uri_parser_1.splitHostPort(target.path); // target.path is "pubsub.googleapis.com:443" if (hostPort !== null) { return hostPort.host; // this returns "pubsub.googleapis.com" } else { throw new Error(`Failed to parse target ${uri_parser_1.uriToString(target)}`); } } --- packages/grpc-js/src/resolver-dns.ts | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/packages/grpc-js/src/resolver-dns.ts b/packages/grpc-js/src/resolver-dns.ts index 2db8a5e41..3f28254bd 100644 --- a/packages/grpc-js/src/resolver-dns.ts +++ b/packages/grpc-js/src/resolver-dns.ts @@ -268,7 +268,13 @@ class DnsResolver implements Resolver { * @param target */ static getDefaultAuthority(target: GrpcUri): string { - return target.path; + const hostPort = uri_parser_1.splitHostPort(target.path); + if (hostPort !== null) { + return hostPort.host; + } + else { + throw new Error(`Failed to parse target ${uri_parser_1.uriToString(target)}`); + } } } From 6f3db6f4d89c8fcd308e700374c69aadf864b19f Mon Sep 17 00:00:00 2001 From: WK Date: Sun, 30 Aug 2020 14:49:54 +0800 Subject: [PATCH 2/7] Update http_proxy.ts --- packages/grpc-js/src/http_proxy.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/packages/grpc-js/src/http_proxy.ts b/packages/grpc-js/src/http_proxy.ts index 8411e117d..e3fdee050 100644 --- a/packages/grpc-js/src/http_proxy.ts +++ b/packages/grpc-js/src/http_proxy.ts @@ -215,8 +215,10 @@ export function getProxiedConnection( * connection to a TLS connection. * This is a workaround for https://github.com/nodejs/node/issues/32922 * See https://github.com/grpc/grpc-node/pull/1369 for more info. */ - const remoteHost = getDefaultAuthority(parsedTarget); - + const targetPath = getDefaultAuthority(parsedTarget); + const hostPort = splitHostPort(targetPath); + const remoteHost = (hostPort !== null) ? hostPort.host : targetPath; + const cts = tls.connect( { host: remoteHost, From 08350ec0efe84eabbb3e950fcdce6d470fe6c555 Mon Sep 17 00:00:00 2001 From: WK Date: Sun, 30 Aug 2020 14:52:20 +0800 Subject: [PATCH 3/7] Update subchannel.ts --- packages/grpc-js/src/subchannel.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/grpc-js/src/subchannel.ts b/packages/grpc-js/src/subchannel.ts index 736562a66..878052466 100644 --- a/packages/grpc-js/src/subchannel.ts +++ b/packages/grpc-js/src/subchannel.ts @@ -467,11 +467,13 @@ export class Subchannel { * if a connection is successfully established through the proxy. * If the proxy is not used, these connectionOptions are discarded * anyway */ - connectionOptions.servername = getDefaultAuthority( + const targetPath = getDefaultAuthority( parseUri(this.options['grpc.http_connect_target'] as string) ?? { path: 'localhost', } ); + const hostPort = splitHostPort(targetPath); + connectionOptions.servername = (hostPort !== null) ? hostPort.host : targetPath; } } } From 6a99983ed110433cedd432c8f020b123aaaf4fd7 Mon Sep 17 00:00:00 2001 From: WK Date: Sun, 30 Aug 2020 14:56:23 +0800 Subject: [PATCH 4/7] Undo changes. --- packages/grpc-js/src/resolver-dns.ts | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/packages/grpc-js/src/resolver-dns.ts b/packages/grpc-js/src/resolver-dns.ts index 3f28254bd..2db8a5e41 100644 --- a/packages/grpc-js/src/resolver-dns.ts +++ b/packages/grpc-js/src/resolver-dns.ts @@ -268,13 +268,7 @@ class DnsResolver implements Resolver { * @param target */ static getDefaultAuthority(target: GrpcUri): string { - const hostPort = uri_parser_1.splitHostPort(target.path); - if (hostPort !== null) { - return hostPort.host; - } - else { - throw new Error(`Failed to parse target ${uri_parser_1.uriToString(target)}`); - } + return target.path; } } From 148b273f196ee5bdfc4a6459d07a5d6440edc0c9 Mon Sep 17 00:00:00 2001 From: WK Date: Tue, 1 Sep 2020 01:28:53 +0800 Subject: [PATCH 5/7] Update http_proxy.ts --- packages/grpc-js/src/http_proxy.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/grpc-js/src/http_proxy.ts b/packages/grpc-js/src/http_proxy.ts index e3fdee050..84e29a50f 100644 --- a/packages/grpc-js/src/http_proxy.ts +++ b/packages/grpc-js/src/http_proxy.ts @@ -217,7 +217,7 @@ export function getProxiedConnection( * See https://github.com/grpc/grpc-node/pull/1369 for more info. */ const targetPath = getDefaultAuthority(parsedTarget); const hostPort = splitHostPort(targetPath); - const remoteHost = (hostPort !== null) ? hostPort.host : targetPath; + const remoteHost = hostPort?.host ?? targetPath; const cts = tls.connect( { From 7fc0035f7f84646269fd391f9cb80ab404f5319a Mon Sep 17 00:00:00 2001 From: WK Date: Tue, 1 Sep 2020 01:30:35 +0800 Subject: [PATCH 6/7] Update subchannel.ts --- packages/grpc-js/src/subchannel.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/grpc-js/src/subchannel.ts b/packages/grpc-js/src/subchannel.ts index 878052466..a8c81df80 100644 --- a/packages/grpc-js/src/subchannel.ts +++ b/packages/grpc-js/src/subchannel.ts @@ -473,7 +473,7 @@ export class Subchannel { } ); const hostPort = splitHostPort(targetPath); - connectionOptions.servername = (hostPort !== null) ? hostPort.host : targetPath; + connectionOptions.servername = hostPort?.host ?? : targetPath; } } } From 158d0dd99f9997e2ad34cec2fc756ae21bddc5f9 Mon Sep 17 00:00:00 2001 From: WK Date: Tue, 1 Sep 2020 01:40:14 +0800 Subject: [PATCH 7/7] Update subchannel.ts --- packages/grpc-js/src/subchannel.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/grpc-js/src/subchannel.ts b/packages/grpc-js/src/subchannel.ts index a8c81df80..3be6dd0a6 100644 --- a/packages/grpc-js/src/subchannel.ts +++ b/packages/grpc-js/src/subchannel.ts @@ -473,7 +473,7 @@ export class Subchannel { } ); const hostPort = splitHostPort(targetPath); - connectionOptions.servername = hostPort?.host ?? : targetPath; + connectionOptions.servername = hostPort?.host ?? targetPath; } } }