From b2d129c4e559cc12a64340f8b36c9a93ddbffefe Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Wed, 12 Oct 2022 11:04:56 -0700 Subject: [PATCH] Fix ipv6 support for simple browser (#163374) Fixes #158599 This correctly handles ipv6 uris, such as `http://[::]:3000`. In these cases, the brackets are required --- extensions/simple-browser/src/extension.ts | 17 +++++++---------- .../simple-browser/src/simpleBrowserManager.ts | 3 ++- 2 files changed, 9 insertions(+), 11 deletions(-) diff --git a/extensions/simple-browser/src/extension.ts b/extensions/simple-browser/src/extension.ts index 63131a43bcf..6d3ded5131b 100644 --- a/extensions/simple-browser/src/extension.ts +++ b/extensions/simple-browser/src/extension.ts @@ -23,18 +23,15 @@ const enabledHosts = new Set([ // localhost IPv4 '127.0.0.1', // localhost IPv6 - '0:0:0:0:0:0:0:1', - '::1', + '[0:0:0:0:0:0:0:1]', + '[::1]', // all interfaces IPv4 '0.0.0.0', // all interfaces IPv6 - '0:0:0:0:0:0:0:0', - '::' + '[0:0:0:0:0:0:0:0]', + '[::]' ]); -const IPv6Localhost = /0\:0\:0\:0\:0\:0\:0\:1|\:\:1/; -const IPv6AllInterfaces = /0\:0\:0\:0\:0\:0\:0\:0|\:\:/; - const openerId = 'simpleBrowser.open'; export function activate(context: vscode.ExtensionContext) { @@ -65,13 +62,13 @@ export function activate(context: vscode.ExtensionContext) { preserveFocus?: boolean; viewColumn: vscode.ViewColumn; }) => { - manager.show(url.toString(), showOptions); + manager.show(url, showOptions); })); context.subscriptions.push(vscode.window.registerExternalUriOpener(openerId, { canOpenExternalUri(uri: vscode.Uri) { // We have to replace the IPv6 hosts with IPv4 because URL can't handle IPv6. - const originalUri = new URL(uri.toString().replace(IPv6Localhost, '127.0.0.1').replace(IPv6AllInterfaces, '0.0.0.0')); + const originalUri = new URL(uri.toString(true)); if (enabledHosts.has(originalUri.hostname)) { return isWeb() ? vscode.ExternalUriOpenerPriority.Default @@ -81,7 +78,7 @@ export function activate(context: vscode.ExtensionContext) { return vscode.ExternalUriOpenerPriority.None; }, openExternalUri(resolveUri: vscode.Uri) { - return manager.show(resolveUri.toString(), { + return manager.show(resolveUri, { viewColumn: vscode.window.activeTextEditor ? vscode.ViewColumn.Beside : vscode.ViewColumn.Active }); } diff --git a/extensions/simple-browser/src/simpleBrowserManager.ts b/extensions/simple-browser/src/simpleBrowserManager.ts index 25a4e9175f5..5cbcc86b342 100644 --- a/extensions/simple-browser/src/simpleBrowserManager.ts +++ b/extensions/simple-browser/src/simpleBrowserManager.ts @@ -19,7 +19,8 @@ export class SimpleBrowserManager { this._activeView = undefined; } - public show(url: string, options?: ShowOptions): void { + public show(inputUri: string | vscode.Uri, options?: ShowOptions): void { + const url = typeof inputUri === 'string' ? inputUri : inputUri.toString(true); if (this._activeView) { this._activeView.show(url, options); } else {