From d27ab54da0cfd6b275dbadd2d0d6ffe0d57e1a4e Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Fri, 21 Jun 2019 17:36:26 -0700 Subject: [PATCH] Extract port mapping helper function --- .../contrib/webview/common/portMapping.ts | 40 +++++++++++-------- 1 file changed, 24 insertions(+), 16 deletions(-) diff --git a/src/vs/workbench/contrib/webview/common/portMapping.ts b/src/vs/workbench/contrib/webview/common/portMapping.ts index 3a9b8ee056a..99c605a52f8 100644 --- a/src/vs/workbench/contrib/webview/common/portMapping.ts +++ b/src/vs/workbench/contrib/webview/common/portMapping.ts @@ -9,6 +9,20 @@ import * as modes from 'vs/editor/common/modes'; import { REMOTE_HOST_SCHEME } from 'vs/platform/remote/common/remoteHosts'; import { ITunnelService, RemoteTunnel } from 'vs/platform/remote/common/tunnel'; +export function extractLocalHostUriMetaDataForPortMapping(uri: URI): { address: string, port: number } | undefined { + if (uri.scheme !== 'http' && uri.scheme !== 'https') { + return undefined; + } + const localhostMatch = /^(localhost):(\d+)$/.exec(uri.authority); + if (!localhostMatch) { + return undefined; + } + return { + address: localhostMatch[1], + port: +localhostMatch[2], + }; +} + export class WebviewPortMappingManager extends Disposable { private readonly _tunnels = new Map>(); @@ -23,31 +37,25 @@ export class WebviewPortMappingManager extends Disposable { public async getRedirect(url: string): Promise { const uri = URI.parse(url); - if (uri.scheme !== 'http' && uri.scheme !== 'https') { - return undefined; - } - - const localhostMatch = /^localhost:(\d+)$/.exec(uri.authority); - if (!localhostMatch) { - return undefined; + const requestLocalHostInfo = extractLocalHostUriMetaDataForPortMapping(uri); + if (!requestLocalHostInfo) { + return requestLocalHostInfo; } - - const port = +localhostMatch[1]; for (const mapping of this.mappings()) { - if (mapping.webviewPort === port) { + if (mapping.webviewPort === requestLocalHostInfo.port) { if (this.extensionLocation && this.extensionLocation.scheme === REMOTE_HOST_SCHEME) { const tunnel = await this.getOrCreateTunnel(mapping.extensionHostPort); if (tunnel) { - return url.replace( - new RegExp(`^${uri.scheme}://localhost:${mapping.webviewPort}(/|$)`), - `${uri.scheme}://localhost:${tunnel.tunnelLocalPort}$1`); + return uri.with({ + authority: `127.0.0.1:${tunnel.tunnelLocalPort}`, + }).toString(); } } if (mapping.webviewPort !== mapping.extensionHostPort) { - return url.replace( - new RegExp(`^${uri.scheme}://localhost:${mapping.webviewPort}(/|$)`), - `${uri.scheme}://localhost:${mapping.extensionHostPort}$1`); + return uri.with({ + authority: `${requestLocalHostInfo.address}:${mapping.extensionHostPort}` + }).toString(); } } } -- GitLab