From 138f488e177d7a37a51d004c57708f3b87bf6da5 Mon Sep 17 00:00:00 2001 From: Sebastian Malton Date: Mon, 13 Jun 2022 11:16:25 -0400 Subject: [PATCH] Move proxy server to injectable Signed-off-by: Sebastian Malton --- src/main/lens-proxy/lens-proxy.injectable.ts | 4 ++-- src/main/lens-proxy/lens-proxy.ts | 23 +++++++++++-------- .../lens-proxy/proxy-server.injectable.ts | 13 +++++++++++ 3 files changed, 28 insertions(+), 12 deletions(-) create mode 100644 src/main/lens-proxy/proxy-server.injectable.ts diff --git a/src/main/lens-proxy/lens-proxy.injectable.ts b/src/main/lens-proxy/lens-proxy.injectable.ts index dfabd0ba52..7c2a93115d 100644 --- a/src/main/lens-proxy/lens-proxy.injectable.ts +++ b/src/main/lens-proxy/lens-proxy.injectable.ts @@ -5,18 +5,18 @@ import { getInjectable } from "@ogre-tools/injectable"; import { LensProxy } from "./lens-proxy"; import routerInjectable from "../router/router.injectable"; -import httpProxy from "http-proxy"; import shellApiRequestInjectable from "./proxy-functions/shell/api-request.injectable"; import lensProxyPortInjectable from "./lens-proxy-port.injectable"; import getClusterForRequestInjectable from "./get-cluster-for-request.injectable"; import kubeApiUpgradeRequestInjectable from "./proxy-functions/kube/api-upgrade-request.injectable"; +import lensProxyServerInjectable from "./proxy-server.injectable"; const lensProxyInjectable = getInjectable({ id: "lens-proxy", instantiate: (di) => new LensProxy({ router: di.inject(routerInjectable), - proxy: httpProxy.createProxy(), + proxy: di.inject(lensProxyServerInjectable), kubeApiUpgradeRequest: di.inject(kubeApiUpgradeRequestInjectable), shellApiRequest: di.inject(shellApiRequestInjectable), getClusterForRequest: di.inject(getClusterForRequestInjectable), diff --git a/src/main/lens-proxy/lens-proxy.ts b/src/main/lens-proxy/lens-proxy.ts index 5d88fae341..595dce7124 100644 --- a/src/main/lens-proxy/lens-proxy.ts +++ b/src/main/lens-proxy/lens-proxy.ts @@ -6,7 +6,6 @@ import net from "net"; import type http from "http"; import spdy from "spdy"; -import type httpProxy from "http-proxy"; import { apiPrefix, apiKubePrefix, contentSecurityPolicy } from "../../common/vars"; import type { Router } from "../router/router"; import type { ClusterContextHandler } from "../context-handler/context-handler"; @@ -17,6 +16,8 @@ import { getBoolean } from "../utils/parse-query"; import assert from "assert"; import type { SetRequired } from "type-fest"; import type { GetClusterForRequest } from "./get-cluster-for-request.injectable"; +import type ProxyServer from "http-proxy"; +import type { ServerOptions } from "http-proxy"; export type ServerIncomingMessage = SetRequired; export type ProxyApiRequest = (args: ProxyApiRequestArgs) => void | Promise; @@ -25,9 +26,9 @@ interface Dependencies { getClusterForRequest: GetClusterForRequest; shellApiRequest: ProxyApiRequest; kubeApiUpgradeRequest: ProxyApiRequest; - router: Router; - proxy: httpProxy; - lensProxyPort: { set: (portNumber: number) => void }; + readonly router: Router; + readonly proxy: ProxyServer; + readonly lensProxyPort: { set: (portNumber: number) => void }; } const watchParam = "watch"; @@ -58,12 +59,12 @@ const disallowedPorts = new Set([ ]); export class LensProxy { - protected proxyServer: http.Server; + protected readonly proxyServer: http.Server; protected closed = false; - protected retryCounters = new Map(); + protected readonly retryCounters = new Map(); - constructor(private dependencies: Dependencies) { - this.configureProxy(dependencies.proxy); + constructor(private readonly dependencies: Dependencies) { + this.configureProxy(this.dependencies.proxy); this.proxyServer = spdy.createServer({ spdy: { @@ -163,7 +164,7 @@ export class LensProxy { this.closed = true; } - protected configureProxy(proxy: httpProxy): httpProxy { + protected configureProxy(proxy: ProxyServer): ProxyServer { proxy.on("proxyRes", (proxyRes, req, res) => { const retryCounterId = this.getRequestId(req); @@ -212,13 +213,15 @@ export class LensProxy { return proxy; } - protected async getProxyTarget(req: http.IncomingMessage, contextHandler: ClusterContextHandler): Promise { + protected async getProxyTarget(req: http.IncomingMessage, contextHandler: ClusterContextHandler): Promise { if (req.url?.startsWith(apiKubePrefix)) { delete req.headers.authorization; req.url = req.url.replace(apiKubePrefix, ""); return contextHandler.getApiTarget(isLongRunningRequest(req.url)); } + + return undefined; } protected getRequestId(req: http.IncomingMessage): string { diff --git a/src/main/lens-proxy/proxy-server.injectable.ts b/src/main/lens-proxy/proxy-server.injectable.ts new file mode 100644 index 0000000000..766bc536a9 --- /dev/null +++ b/src/main/lens-proxy/proxy-server.injectable.ts @@ -0,0 +1,13 @@ +/** + * Copyright (c) OpenLens Authors. All rights reserved. + * Licensed under MIT License. See LICENSE in root directory for more information. + */ +import { getInjectable } from "@ogre-tools/injectable"; +import Server from "http-proxy"; + +const lensProxyServerInjectable = getInjectable({ + id: "lens-proxy-server", + instantiate: () => new Server(), +}); + +export default lensProxyServerInjectable;