diff --git a/src/lib/strings/url-helpers.ts b/src/lib/strings/url-helpers.ts index 08ecf4b566..6a4e3335f8 100644 --- a/src/lib/strings/url-helpers.ts +++ b/src/lib/strings/url-helpers.ts @@ -27,6 +27,15 @@ const TRUSTED_REGEX = new RegExp( )})|/|#)`, ) +export function canParseUrl(url: string | URL, base?: string | URL): boolean { + try { + new URL(url, base) + return true + } catch { + return false + } +} + export function isValidDomain(str: string): boolean { return !!TLDs.find(tld => { let i = str.lastIndexOf(tld) diff --git a/src/state/session/session-core.ts b/src/state/session/session-core.ts index cce2a0e2d5..dbed9bfa2f 100644 --- a/src/state/session/session-core.ts +++ b/src/state/session/session-core.ts @@ -6,6 +6,7 @@ import { } from '@atproto/lex-password-session' import {PUBLIC_BSKY_SERVICE} from '#/lib/constants' +import {canParseUrl} from '#/lib/strings/url-helpers' import {logger} from '#/logger' import {prefetchAgeAssuranceServerData} from '#/ageAssurance/data' import {features} from '#/analytics' @@ -102,7 +103,7 @@ export function buildBundle( * and let the session route against its own service instead. */ const agent = - storedPdsUrl && URL.canParse(storedPdsUrl) + storedPdsUrl && canParseUrl(storedPdsUrl) ? routeSessionToPds(session, storedPdsUrl) : session return {