From 72390ab2670d8fb5aa020aab3549c9f7fe562eb3 Mon Sep 17 00:00:00 2001 From: Carlos Esteban Lopez Date: Thu, 14 Sep 2023 11:29:57 -0500 Subject: [PATCH] fix: Handle Proxy WS upgrade manually for WS handshakes Signed-off-by: Carlos Esteban Lopez --- .changeset/clean-icons-wonder.md | 5 ++++ plugins/kubernetes-backend/package.json | 1 + .../src/service/KubernetesProxy.test.ts | 4 --- .../src/service/KubernetesProxy.ts | 28 ++++++++++++++++--- yarn.lock | 1 + 5 files changed, 31 insertions(+), 8 deletions(-) create mode 100644 .changeset/clean-icons-wonder.md diff --git a/.changeset/clean-icons-wonder.md b/.changeset/clean-icons-wonder.md new file mode 100644 index 0000000000..b6beb58969 --- /dev/null +++ b/.changeset/clean-icons-wonder.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-kubernetes-backend': patch +--- + +Handle Proxy WS upgrade manually for WS handshakes diff --git a/plugins/kubernetes-backend/package.json b/plugins/kubernetes-backend/package.json index f755dc2c6b..19ded3ba59 100644 --- a/plugins/kubernetes-backend/package.json +++ b/plugins/kubernetes-backend/package.json @@ -75,6 +75,7 @@ "express-promise-router": "^4.1.0", "fs-extra": "10.1.0", "helmet": "^6.0.0", + "http-proxy": "^1.18.1", "http-proxy-middleware": "^2.0.6", "lodash": "^4.17.21", "luxon": "^3.0.0", diff --git a/plugins/kubernetes-backend/src/service/KubernetesProxy.test.ts b/plugins/kubernetes-backend/src/service/KubernetesProxy.test.ts index a84482082f..75ae6bcf27 100644 --- a/plugins/kubernetes-backend/src/service/KubernetesProxy.test.ts +++ b/plugins/kubernetes-backend/src/service/KubernetesProxy.test.ts @@ -769,10 +769,6 @@ describe('KubernetesProxy', () => { ), ); - // Prepopulate the proxy so the WebSocket upgrade can happen, result doesn't actually matter - const result = await fetch(wsProxyAddress.replace('ws', 'http')); - expect(result.ok).toBeFalsy(); - const webSocket = new WebSocket(wsProxyAddress); const connectMessagePromise = eventPromiseFactory(webSocket, 'message'); diff --git a/plugins/kubernetes-backend/src/service/KubernetesProxy.ts b/plugins/kubernetes-backend/src/service/KubernetesProxy.ts index 6e699d1220..c9a88854b2 100644 --- a/plugins/kubernetes-backend/src/service/KubernetesProxy.ts +++ b/plugins/kubernetes-backend/src/service/KubernetesProxy.ts @@ -13,7 +13,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - import { ErrorResponseBody, ForwardedError, @@ -24,16 +23,19 @@ import { import { getBearerTokenFromAuthorizationHeader } from '@backstage/plugin-auth-node'; import { kubernetesProxyPermission } from '@backstage/plugin-kubernetes-common'; import { - PermissionEvaluator, AuthorizeResult, + PermissionEvaluator, } from '@backstage/plugin-permission-common'; import { bufferFromFileOrString } from '@kubernetes/client-node'; -import type { Request, RequestHandler } from 'express'; +import { IncomingMessage, ServerResponse } from 'http'; +import Server from 'http-proxy'; import { createProxyMiddleware } from 'http-proxy-middleware'; import { Logger } from 'winston'; import { AuthenticationStrategy } from '../auth'; import { ClusterDetails, KubernetesClustersSupplier } from '../types/types'; +import type { Request, RequestHandler } from 'express'; + export const APPLICATION_JSON: string = 'application/json'; /** @@ -121,7 +123,25 @@ export class KubernetesProxy { } const middleware = await this.getMiddleware(req); - middleware(req, res, next); + if ( + req.header('connection')?.toLowerCase() === 'upgrade' && + req.header('upgrade')?.toLowerCase() === 'websocket' + ) { + type IPartialUpgradeHandler = ( + ...args: Partial< + Parameters< + Server>['ws'] + > + > + ) => void; + ( + middleware as unknown as { + upgrade: IPartialUpgradeHandler; + } + ).upgrade(req, req.socket); + } else { + middleware(req, res, next); + } }; } diff --git a/yarn.lock b/yarn.lock index 0176682861..762737c213 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7651,6 +7651,7 @@ __metadata: express-promise-router: ^4.1.0 fs-extra: 10.1.0 helmet: ^6.0.0 + http-proxy: ^1.18.1 http-proxy-middleware: ^2.0.6 lodash: ^4.17.21 luxon: ^3.0.0