fix: Handle Proxy WS upgrade manually for WS handshakes

Signed-off-by: Carlos Esteban Lopez <lcarlosesteb@vmware.com>
This commit is contained in:
Carlos Esteban Lopez
2023-09-14 11:29:57 -05:00
parent 8cc2b97796
commit 72390ab267
5 changed files with 31 additions and 8 deletions
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-kubernetes-backend': patch
---
Handle Proxy WS upgrade manually for WS handshakes
+1
View File
@@ -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",
@@ -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');
@@ -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<IncomingMessage, ServerResponse<IncomingMessage>>['ws']
>
>
) => void;
(
middleware as unknown as {
upgrade: IPartialUpgradeHandler;
}
).upgrade(req, req.socket);
} else {
middleware(req, res, next);
}
};
}
+1
View File
@@ -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