fix: Handle Proxy WS upgrade manually for WS handshakes
Signed-off-by: Carlos Esteban Lopez <lcarlosesteb@vmware.com>
This commit is contained in:
@@ -0,0 +1,5 @@
|
||||
---
|
||||
'@backstage/plugin-kubernetes-backend': patch
|
||||
---
|
||||
|
||||
Handle Proxy WS upgrade manually for WS handshakes
|
||||
@@ -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);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user