From 856666d5bdc003c467384c5e4f25efab5ae2469a Mon Sep 17 00:00:00 2001 From: Szymon Kaliski Date: Fri, 5 Jan 2024 09:43:33 +0100 Subject: [PATCH] fix url parsing for urls with percentage sign in them --- addons/addon-web-links/src/WebLinkProvider.ts | 15 +++++++++++++-- addons/addon-web-links/test/WebLinksAddon.api.ts | 7 +++++++ 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/addons/addon-web-links/src/WebLinkProvider.ts b/addons/addon-web-links/src/WebLinkProvider.ts index 25dd983c..1000b788 100644 --- a/addons/addon-web-links/src/WebLinkProvider.ts +++ b/addons/addon-web-links/src/WebLinkProvider.ts @@ -41,6 +41,18 @@ export class WebLinkProvider implements ILinkProvider { } } +function baseUrlString(url: URL): string { + if (url.password && url.username) { + return `${url.protocol}//${url.username}:${url.password}@${url.host}`; + } + + if (url.username) { + return `${url.protocol}//${url.username}@${url.host}`; + } + + return `${url.protocol}//${url.host}`; +} + export class LinkComputer { public static computeLink(y: number, regex: RegExp, terminal: Terminal, activate: (event: MouseEvent, uri: string) => void): ILink[] { const rex = new RegExp(regex.source, (regex.flags || '') + 'g'); @@ -64,8 +76,7 @@ export class LinkComputer { // - append / also match domain urls w'o any path notion try { const url = new URL(text); - const urlText = decodeURI(url.toString()); - if (text !== urlText && text + '/' !== urlText) { + if (!text.startsWith(baseUrlString(url))) { continue; } } catch (e) { diff --git a/addons/addon-web-links/test/WebLinksAddon.api.ts b/addons/addon-web-links/test/WebLinksAddon.api.ts index fb5be20b..5b05ce2e 100644 --- a/addons/addon-web-links/test/WebLinksAddon.api.ts +++ b/addons/addon-web-links/test/WebLinksAddon.api.ts @@ -115,6 +115,13 @@ describe('WebLinksAddon', () => { await resetAndHover(5, 1); await evalLinkStateData('http://test:password@example.com/some_path', { start: { x: 12, y: 1 }, end: { x: 13, y: 2 } }); }); + it('url encoded params work properly', async () => { + await writeSync(page, '¥¥¥cafe\u0301 http://test:password@example.com/some_path?param=1%202%3'); + await resetAndHover(12, 0); + await evalLinkStateData('http://test:password@example.com/some_path?param=1%202%3', { start: { x: 12, y: 1 }, end: { x: 27, y: 2 } }); + await resetAndHover(5, 1); + await evalLinkStateData('http://test:password@example.com/some_path?param=1%202%3', { start: { x: 12, y: 1 }, end: { x: 27, y: 2 } }); + }); }); });