diff --git a/packages/utils/src/dsn.ts b/packages/utils/src/dsn.ts index a364c47d5d6b..d6dd4a7da2b7 100644 --- a/packages/utils/src/dsn.ts +++ b/packages/utils/src/dsn.ts @@ -3,7 +3,7 @@ import { DsnComponents, DsnLike, DsnProtocol } from '@sentry/types'; import { SentryError } from './error'; /** Regular expression used to parse a Dsn. */ -const DSN_REGEX = /^(?:(\w+):)\/\/(?:(\w+)(?::(\w+))?@)([\w.-]+)(?::(\d+))?\/(.+)/; +const DSN_REGEX = /^(?:(\w+):)\/\/(?:(\w+)(?::(\w+)?)?@)([\w.-]+)(?::(\d+))?\/(.+)/; function isValidProtocol(protocol?: string): protocol is DsnProtocol { return protocol === 'http' || protocol === 'https'; diff --git a/packages/utils/test/dsn.test.ts b/packages/utils/test/dsn.test.ts index c9088c878e18..3a5bb3e7da6c 100644 --- a/packages/utils/test/dsn.test.ts +++ b/packages/utils/test/dsn.test.ts @@ -120,6 +120,17 @@ describe('Dsn', () => { expect(dsn.projectId).toBe('321'); }); + test('parses a Dsn with empty password', () => { + const dsn = makeDsn('https://abc:@sentry.io/123/321'); + expect(dsn.protocol).toBe('https'); + expect(dsn.publicKey).toBe('abc'); + expect(dsn.pass).toBe(''); + expect(dsn.host).toBe('sentry.io'); + expect(dsn.port).toBe(''); + expect(dsn.path).toBe('123'); + expect(dsn.projectId).toBe('321'); + }); + test('with a long path', () => { const dsn = makeDsn('https://abc@sentry.io/sentry/custom/installation/321'); expect(dsn.protocol).toBe('https');