From c2e53065353995abebbab4cf0a6290a16058b1ab Mon Sep 17 00:00:00 2001 From: Carlos Esteban Lopez Date: Thu, 15 Jun 2023 18:40:37 -0500 Subject: [PATCH] feat(kubernetes-backend): Add WebSocket support to `kubernetes-backend` proxy. Signed-off-by: Carlos Esteban Lopez --- .changeset/khaki-rocks-do.md | 5 +++++ .../src/service/KubernetesProxy.ts | 14 ++++++++++---- 2 files changed, 15 insertions(+), 4 deletions(-) create mode 100644 .changeset/khaki-rocks-do.md diff --git a/.changeset/khaki-rocks-do.md b/.changeset/khaki-rocks-do.md new file mode 100644 index 0000000000..a9eb55d533 --- /dev/null +++ b/.changeset/khaki-rocks-do.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-kubernetes-backend': patch +--- + +Add WebSocket support to `kubernetes-backend` proxy. diff --git a/plugins/kubernetes-backend/src/service/KubernetesProxy.ts b/plugins/kubernetes-backend/src/service/KubernetesProxy.ts index 8e8fd54c77..7e03d863b8 100644 --- a/plugins/kubernetes-backend/src/service/KubernetesProxy.ts +++ b/plugins/kubernetes-backend/src/service/KubernetesProxy.ts @@ -135,20 +135,26 @@ export class KubernetesProxy { const logger = this.logger.child({ cluster: originalCluster.name }); middleware = createProxyMiddleware({ logProvider: () => logger, + ws: true, secure: !originalCluster.skipTLSVerify, changeOrigin: true, + pathRewrite: { [`^${originalReq.baseUrl}`]: '' }, router: async req => { - // Re-evaluate the cluster on each request, in case it has changed - const cluster = await this.getClusterForRequest(req); + const isWS = req.headers.upgrade === 'websocket'; + const cluster = isWS + ? originalCluster + : await this.getClusterForRequest(req); const url = new URL(cluster.url); + const ca = bufferFromFileOrString('', cluster.caData)?.toString(); + + // Re-evaluate the cluster on each request, in case it has changed return { protocol: url.protocol, host: url.hostname, port: url.port, - ca: bufferFromFileOrString('', cluster.caData)?.toString(), + ca, }; }, - pathRewrite: { [`^${originalReq.baseUrl}`]: '' }, onError: (error, req, res) => { const wrappedError = new ForwardedError( `Cluster '${originalCluster.name}' request error`,