Skip to content

Commit

Permalink
fix(core): Use makeDsn from core to extract the URL from DSN for filt…
Browse files Browse the repository at this point in the history
…ering breadcrumbs (#4395)
  • Loading branch information
antonis authored Jan 16, 2025
1 parent ae7b03d commit a38594f
Show file tree
Hide file tree
Showing 3 changed files with 57 additions and 17 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
### Fixes

- Use proper SDK name for Session Replay tags ([#4428](https://github.com/getsentry/sentry-react-native/pull/4428))
- Use `makeDsn` from `core` to extract the URL from DSN avoiding unimplemented `URL.protocol` errors ([#4395]https://github.com/getsentry/sentry-react-native/pull/4395)

### Changes

Expand Down
12 changes: 6 additions & 6 deletions packages/core/src/js/sdk.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
/* eslint-disable complexity */
import type { Breadcrumb, BreadcrumbHint, Integration, Scope, SendFeedbackParams, UserFeedback } from '@sentry/core';
import { captureFeedback, getClient, getGlobalScope, getIntegrationsToSetup, getIsolationScope, initAndBind, logger, stackParserFromStackParserOptions, withScope as coreWithScope } from '@sentry/core';
import { captureFeedback, getClient, getGlobalScope, getIntegrationsToSetup, getIsolationScope, initAndBind, logger, makeDsn, stackParserFromStackParserOptions, withScope as coreWithScope } from '@sentry/core';
import {
defaultStackParser,
makeFetchTransport,
Expand Down Expand Up @@ -66,13 +66,13 @@ export function init(passedOptions: ReactNativeOptions): void {
if (!dsn) {
return undefined;
}
try {
const url = new URL(dsn);
return `${url.protocol}//${url.host}`;
} catch (e) {
logger.error('Failed to extract url from DSN', e);
const dsnComponents = makeDsn(dsn);
if (!dsnComponents) {
logger.error('Failed to extract url from DSN: ', dsn);
return undefined;
}
const port = dsnComponents.port ? `:${dsnComponents.port}` : '';
return `${dsnComponents.protocol}://${dsnComponents.host}${port}`;
};

const userBeforeBreadcrumb = safeFactory(passedOptions.beforeBreadcrumb, { loggerMessage: 'The beforeBreadcrumb threw an error' });
Expand Down
61 changes: 50 additions & 11 deletions packages/core/test/sdk.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -321,7 +321,7 @@ describe('Tests the SDK functionality', () => {
expect(result).toBeNull();
});

it('should filters out dsn breadcrumbs', () => {
it('should filter out dsn breadcrumbs', () => {
(getDevServer as jest.Mock).mockReturnValue({ url: 'http://localhost:8081' });

const mockBeforeBreadcrumb = (breadcrumb: Breadcrumb, _hint?: BreadcrumbHint) => {
Expand All @@ -345,37 +345,76 @@ describe('Tests the SDK functionality', () => {
expect(result).toBeNull();
});

it('should keep breadcrumbs matching dsn if the url parsing fails for dsn', () => {
it('should filter out dsn breadcrumbs that the ports match', () => {
(getDevServer as jest.Mock).mockReturnValue({ url: 'http://localhost:8081' });

const mockBeforeBreadcrumb = (breadcrumb: Breadcrumb, _hint?: BreadcrumbHint) => {
return breadcrumb;
};

// Mock the URL constructor to throw an exception for this test case
const originalURL = (global as any).URL;
jest.spyOn(global as any, 'URL').mockImplementationOnce(() => {
throw new Error('Failed to parse DSN URL');
});
const passedOptions = {
dsn: 'https://[email protected]:8181/1234567',
beforeBreadcrumb: mockBeforeBreadcrumb,
};

init(passedOptions);

const breadcrumb: Breadcrumb = {
type: 'http',
data: { url: 'https://selfhosted.app.server:8181/api' },
};

const result = usedOptions()?.beforeBreadcrumb!(breadcrumb);

expect(result).toBeNull();
});

it('should keep breadcrumbs if the ports do not match', () => {
(getDevServer as jest.Mock).mockReturnValue({ url: 'http://localhost:8081' });

const mockBeforeBreadcrumb = (breadcrumb: Breadcrumb, _hint?: BreadcrumbHint) => {
return breadcrumb;
};

const passedOptions = {
dsn: 'https://[email protected]/1234567',
dsn: 'https://[email protected]:8181/1234567',
beforeBreadcrumb: mockBeforeBreadcrumb,
};

init(passedOptions);

const breadcrumb: Breadcrumb = {
type: 'http',
data: { url: 'https://def.ingest.sentry.io/1234567' },
data: { url: 'https://selfhosted.app.server:8080/api' },
};

const result = usedOptions()?.beforeBreadcrumb!(breadcrumb);

expect(result).toEqual(breadcrumb);
});

it('should keep breadcrumbs if the url parsing fails for dsn', () => {
(getDevServer as jest.Mock).mockReturnValue({ url: 'http://localhost:8081' });

const mockBeforeBreadcrumb = (breadcrumb: Breadcrumb, _hint?: BreadcrumbHint) => {
return breadcrumb;
};

const passedOptions = {
dsn: 'invalid-dsn',
beforeBreadcrumb: mockBeforeBreadcrumb,
};

init(passedOptions);

// Restore the original URL constructor
(global as any).URL = originalURL;
const breadcrumb: Breadcrumb = {
type: 'http',
data: { url: 'https://def.ingest.sentry.io/1234567' },
};

const result = usedOptions()?.beforeBreadcrumb!(breadcrumb);

expect(result).toEqual(breadcrumb);
});

it('should keep non dev server or dsn breadcrumbs', () => {
Expand Down

0 comments on commit a38594f

Please sign in to comment.