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.test.ts b/plugins/kubernetes-backend/src/service/KubernetesProxy.test.ts index aaf3843e61..038a3d4bad 100644 --- a/plugins/kubernetes-backend/src/service/KubernetesProxy.test.ts +++ b/plugins/kubernetes-backend/src/service/KubernetesProxy.test.ts @@ -54,6 +54,10 @@ describe('KubernetesProxy', () => { params: { path, }, + headers: { + 'content-type': 'application/json', + [HEADER_KUBERNETES_CLUSTER.toLowerCase()]: clusterName, + }, header: jest.fn((key: string) => { switch (key) { case 'Content-Type': { diff --git a/plugins/kubernetes-backend/src/service/KubernetesProxy.ts b/plugins/kubernetes-backend/src/service/KubernetesProxy.ts index 8e8fd54c77..36617bbbad 100644 --- a/plugins/kubernetes-backend/src/service/KubernetesProxy.ts +++ b/plugins/kubernetes-backend/src/service/KubernetesProxy.ts @@ -135,12 +135,15 @@ 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 url = new URL(cluster.url); + return { protocol: url.protocol, host: url.hostname, @@ -148,7 +151,6 @@ export class KubernetesProxy { ca: bufferFromFileOrString('', cluster.caData)?.toString(), }; }, - pathRewrite: { [`^${originalReq.baseUrl}`]: '' }, onError: (error, req, res) => { const wrappedError = new ForwardedError( `Cluster '${originalCluster.name}' request error`, @@ -173,7 +175,7 @@ export class KubernetesProxy { } private async getClusterForRequest(req: Request): Promise { - const clusterName = req.header(HEADER_KUBERNETES_CLUSTER); + const clusterName = req.headers[HEADER_KUBERNETES_CLUSTER.toLowerCase()]; const clusters = await this.clusterSupplier.getClusters(); if (!clusters || clusters.length <= 0) {