From 1f148e93496f4fb7ed245ed7c5c3b157552b16b4 Mon Sep 17 00:00:00 2001 From: Segev Finer Date: Fri, 27 Oct 2023 19:28:37 +0300 Subject: [PATCH 1/2] Fix missing port in proxy CONNECT when using the default HTTPS port --- packages/grpc-js/src/http_proxy.ts | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/grpc-js/src/http_proxy.ts b/packages/grpc-js/src/http_proxy.ts index 3aed28c85..d1df22d2b 100644 --- a/packages/grpc-js/src/http_proxy.ts +++ b/packages/grpc-js/src/http_proxy.ts @@ -189,12 +189,16 @@ export function getProxiedConnection( if (parsedTarget === null) { return Promise.resolve({}); } + const targetHostPost = splitHostPort(parsedTarget.path); + if (targetHostPost === null) { + return Promise.resolve({}); + } const options: http.RequestOptions = { method: 'CONNECT', - path: parsedTarget.path, + path: targetHostPost.host + ':' + (targetHostPost.port != null ? targetHostPost.port : '443'), }; const headers: http.OutgoingHttpHeaders = { - Host: parsedTarget.path, + Host: targetHostPost.host + ':' + (targetHostPost.port != null ? targetHostPost.port : '443'), }; // Connect to the subchannel address as a proxy if (isTcpSubchannelAddress(address)) { From 0854192dbaf3e305fb450f29ee0bfda57356668a Mon Sep 17 00:00:00 2001 From: Segev Finer Date: Tue, 31 Oct 2023 00:19:32 +0200 Subject: [PATCH 2/2] Review fixes --- packages/grpc-js/src/http_proxy.ts | 12 ++++++++---- packages/grpc-js/src/resolver-dns.ts | 2 +- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/packages/grpc-js/src/http_proxy.ts b/packages/grpc-js/src/http_proxy.ts index d1df22d2b..3e905c488 100644 --- a/packages/grpc-js/src/http_proxy.ts +++ b/packages/grpc-js/src/http_proxy.ts @@ -30,6 +30,7 @@ import { import { ChannelOptions } from './channel-options'; import { GrpcUri, parseUri, splitHostPort, uriToString } from './uri-parser'; import { URL } from 'url'; +import { DEFAULT_PORT } from './resolver-dns'; const TRACER_NAME = 'proxy'; @@ -189,16 +190,19 @@ export function getProxiedConnection( if (parsedTarget === null) { return Promise.resolve({}); } - const targetHostPost = splitHostPort(parsedTarget.path); - if (targetHostPost === null) { + const splitHostPost = splitHostPort(parsedTarget.path); + if (splitHostPost === null) { return Promise.resolve({}); } + const hostPort = `${splitHostPost.host}:${ + splitHostPost.port ?? DEFAULT_PORT + }`; const options: http.RequestOptions = { method: 'CONNECT', - path: targetHostPost.host + ':' + (targetHostPost.port != null ? targetHostPost.port : '443'), + path: hostPort, }; const headers: http.OutgoingHttpHeaders = { - Host: targetHostPost.host + ':' + (targetHostPost.port != null ? targetHostPost.port : '443'), + Host: hostPort, }; // Connect to the subchannel address as a proxy if (isTcpSubchannelAddress(address)) { diff --git a/packages/grpc-js/src/resolver-dns.ts b/packages/grpc-js/src/resolver-dns.ts index 9431183d3..31e0d0bab 100644 --- a/packages/grpc-js/src/resolver-dns.ts +++ b/packages/grpc-js/src/resolver-dns.ts @@ -43,7 +43,7 @@ function trace(text: string): void { /** * The default TCP port to connect to if not explicitly specified in the target. */ -const DEFAULT_PORT = 443; +export const DEFAULT_PORT = 443; const DEFAULT_MIN_TIME_BETWEEN_RESOLUTIONS_MS = 30_000;