Skip to content

Commit

Permalink
fix: normalize prefix when parsing. fixes #9081
Browse files Browse the repository at this point in the history
  • Loading branch information
satya164 committed Jan 22, 2021
1 parent 35747a6 commit 4ca2d2d
Show file tree
Hide file tree
Showing 3 changed files with 352 additions and 24 deletions.
318 changes: 318 additions & 0 deletions packages/native/src/__tests__/extractPathFromURL.test.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,318 @@
import extractPathFromURL from '../extractPathFromURL';

it('extracts path from URL with protocol', () => {
expect(extractPathFromURL(['scheme://'], 'scheme://some/path')).toBe(
'some/path'
);

expect(extractPathFromURL(['scheme://'], 'scheme:some/path')).toBe(
'some/path'
);

expect(extractPathFromURL(['scheme://'], 'scheme:///some/path')).toBe(
'some/path'
);

expect(extractPathFromURL(['scheme:///'], 'scheme:some/path')).toBe(
'some/path'
);

expect(extractPathFromURL(['scheme:'], 'scheme:some/path')).toBe('some/path');

expect(extractPathFromURL(['scheme:'], 'scheme://some/path')).toBe(
'some/path'
);

expect(extractPathFromURL(['scheme:'], 'scheme:///some/path')).toBe(
'some/path'
);
});

it('extracts path from URL with protocol and host', () => {
expect(
extractPathFromURL(
['scheme://example.com'],
'scheme://example.com/some/path'
)
).toBe('/some/path');

expect(
extractPathFromURL(['scheme://example.com'], 'scheme:example.com/some/path')
).toBe('/some/path');

expect(
extractPathFromURL(
['scheme://example.com'],
'scheme:///example.com/some/path'
)
).toBe('/some/path');

expect(
extractPathFromURL(
['scheme:///example.com'],
'scheme:example.com/some/path'
)
).toBe('/some/path');

expect(
extractPathFromURL(['scheme:example.com'], 'scheme:example.com/some/path')
).toBe('/some/path');

expect(
extractPathFromURL(['scheme:example.com'], 'scheme://example.com/some/path')
).toBe('/some/path');

expect(
extractPathFromURL(
['scheme:example.com'],
'scheme:///example.com/some/path'
)
).toBe('/some/path');
});

it('extracts path from URL with protocol and host with wildcard', () => {
expect(
extractPathFromURL(
['scheme://*.example.com'],
'scheme://test.example.com/some/path'
)
).toBe('/some/path');

expect(
extractPathFromURL(
['scheme://*.example.com'],
'scheme:test.example.com/some/path'
)
).toBe('/some/path');

expect(
extractPathFromURL(
['scheme://*.example.com'],
'scheme:///test.example.com/some/path'
)
).toBe('/some/path');

expect(
extractPathFromURL(
['scheme:///*.example.com'],
'scheme:test.example.com/some/path'
)
).toBe('/some/path');

expect(
extractPathFromURL(
['scheme:*.example.com'],
'scheme:test.example.com/some/path'
)
).toBe('/some/path');

expect(
extractPathFromURL(
['scheme:*.example.com'],
'scheme://test.example.com/some/path'
)
).toBe('/some/path');

expect(
extractPathFromURL(
['scheme:*.example.com'],
'scheme:///test.example.com/some/path'
)
).toBe('/some/path');
});

it('extracts path from URL with protocol, host and path', () => {
expect(
extractPathFromURL(
['scheme://example.com/test'],
'scheme://example.com/test/some/path'
)
).toBe('/some/path');

expect(
extractPathFromURL(['scheme://example.com'], 'scheme:example.com/some/path')
).toBe('/some/path');

expect(
extractPathFromURL(
['scheme://example.com/test'],
'scheme:///example.com/test/some/path'
)
).toBe('/some/path');

expect(
extractPathFromURL(
['scheme:///example.com/test'],
'scheme:example.com/test/some/path'
)
).toBe('/some/path');

expect(
extractPathFromURL(
['scheme:example.com/test'],
'scheme:example.com/test/some/path'
)
).toBe('/some/path');

expect(
extractPathFromURL(
['scheme:example.com/test'],
'scheme://example.com/test/some/path'
)
).toBe('/some/path');

expect(
extractPathFromURL(
['scheme:example.com/test'],
'scheme:///example.com/test/some/path'
)
).toBe('/some/path');

expect(
extractPathFromURL(
['scheme:example.com/test'],
'scheme:///example.com//test/some/path'
)
).toBe('/some/path');

expect(
extractPathFromURL(
['scheme:example.com/test'],
'scheme:///example.com/test//some/path'
)
).toBe('/some/path');

expect(
extractPathFromURL(
['scheme:example.com/test'],
'scheme:///example.com/test/some//path'
)
).toBe('/some/path');
});

it('returns undefined for non-matching protocol', () => {
expect(extractPathFromURL(['scheme://'], 'foo://some/path')).toBe(undefined);

expect(extractPathFromURL(['scheme://'], 'foo:some/path')).toBe(undefined);

expect(extractPathFromURL(['scheme://'], 'foo:///some/path')).toBe(undefined);

expect(extractPathFromURL(['scheme:///'], 'foo:some/path')).toBe(undefined);

expect(extractPathFromURL(['scheme:'], 'foo:some/path')).toBe(undefined);

expect(extractPathFromURL(['scheme:'], 'foo://some/path')).toBe(undefined);

expect(extractPathFromURL(['scheme:'], 'foo:///some/path')).toBe(undefined);
});

it('returns undefined for non-matching path', () => {
expect(extractPathFromURL(['scheme://foo'], 'scheme://some/path')).toBe(
undefined
);

expect(extractPathFromURL(['scheme://foo'], 'scheme:some/path')).toBe(
undefined
);

expect(extractPathFromURL(['scheme://foo'], 'scheme:///some/path')).toBe(
undefined
);

expect(extractPathFromURL(['scheme:///foo'], 'scheme:some/path')).toBe(
undefined
);

expect(extractPathFromURL(['scheme:foo'], 'scheme:some/path')).toBe(
undefined
);

expect(extractPathFromURL(['scheme:foo'], 'scheme://some/path')).toBe(
undefined
);

expect(extractPathFromURL(['scheme:foo'], 'scheme:///some/path')).toBe(
undefined
);
});

it('returns undefined for non-matching host', () => {
expect(
extractPathFromURL(['scheme://example.com'], 'scheme://foo.com/some/path')
).toBe(undefined);

expect(
extractPathFromURL(['scheme://example.com'], 'scheme:foo.com/some/path')
).toBe(undefined);

expect(
extractPathFromURL(['scheme://example.com'], 'scheme:///foo.com/some/path')
).toBe(undefined);

expect(
extractPathFromURL(['scheme:///example.com'], 'scheme:foo.com/some/path')
).toBe(undefined);

expect(
extractPathFromURL(['scheme:example.com'], 'scheme:foo.com/some/path')
).toBe(undefined);

expect(
extractPathFromURL(['scheme:example.com'], 'scheme://foo.com/some/path')
).toBe(undefined);

expect(
extractPathFromURL(['scheme:example.com'], 'scheme:///foo.com/some/path')
).toBe(undefined);
});

it('returns undefined for non-matching host with wildcard', () => {
expect(
extractPathFromURL(
['scheme://*.example.com'],
'scheme://test.foo.com/some/path'
)
).toBe(undefined);

expect(
extractPathFromURL(
['scheme://*.example.com'],
'scheme:test.foo.com/some/path'
)
).toBe(undefined);

expect(
extractPathFromURL(
['scheme://*.example.com'],
'scheme:///test.foo.com/some/path'
)
).toBe(undefined);

expect(
extractPathFromURL(
['scheme:///*.example.com'],
'scheme:test.foo.com/some/path'
)
).toBe(undefined);

expect(
extractPathFromURL(
['scheme:*.example.com'],
'scheme:test.foo.com/some/path'
)
).toBe(undefined);

expect(
extractPathFromURL(
['scheme:*.example.com'],
'scheme://test.foo.com/some/path'
)
).toBe(undefined);

expect(
extractPathFromURL(
['scheme:*.example.com'],
'scheme:///test.foo.com/some/path'
)
).toBe(undefined);
});
26 changes: 26 additions & 0 deletions packages/native/src/extractPathFromURL.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
import escapeStringRegexp from 'escape-string-regexp';

export default function extractPathFromURL(prefixes: string[], url: string) {
for (const prefix of prefixes) {
const protocol = prefix.match(/^[^:]+:/)?.[0] ?? '';
const host = prefix
.replace(new RegExp(`^${escapeStringRegexp(protocol)}`), '')
.replace(/\/+/g, '/') // Replace multiple slash (//) with single ones
.replace(/^\//, ''); // Remove extra leading slash

const prefixRegex = new RegExp(
`^${escapeStringRegexp(protocol)}(/)*${host
.split('.')
.map((it) => (it === '*' ? '[^/]+' : escapeStringRegexp(it)))
.join('\\.')}`
);

const normalizedURL = url.replace(/\/+/g, '/');

if (prefixRegex.test(normalizedURL)) {
return normalizedURL.replace(prefixRegex, '');
}
}

return undefined;
}

0 comments on commit 4ca2d2d

Please sign in to comment.