fix: Allow URLs with multiple leading slashes.

Fixes https://github.com/solid/community-server/issues/1025
This commit is contained in:
Ruben Verborgh 2021-10-25 23:38:39 +02:00
parent 2e4589938f
commit b42150cf52
2 changed files with 11 additions and 6 deletions

View File

@ -45,12 +45,11 @@ export class OriginalUrlExtractor extends TargetExtractor {
}
// URL object applies punycode encoding to domain
const base = `${protocol}://${host}`;
const originalUrl = new URL(toCanonicalUriPath(url), base);
// Drop the query string if requested
if (!this.includeQueryString) {
originalUrl.search = '';
const originalUrl = new URL(`${protocol}://${host}`);
const [ , pathname, search ] = /^([^?]*)(.*)/u.exec(toCanonicalUriPath(url))!;
originalUrl.pathname = pathname;
if (this.includeQueryString && search) {
originalUrl.search = search;
}
return { path: originalUrl.href };

View File

@ -32,6 +32,12 @@ describe('A OriginalUrlExtractor', (): void => {
.resolves.toEqual({ path: 'http://test.com/url' });
});
it('returns an input URL with multiple leading slashes.', async(): Promise<void> => {
const noQuery = new OriginalUrlExtractor({ includeQueryString: true });
await expect(noQuery.handle({ request: { url: '///url?abc=def&xyz', headers: { host: 'test.com' }} as any }))
.resolves.toEqual({ path: 'http://test.com///url?abc=def&xyz' });
});
it('drops the query string when includeQueryString is set to false.', async(): Promise<void> => {
await expect(extractor.handle({ request: { url: '/url?abc=def&xyz', headers: { host: 'test.com' }} as any }))
.resolves.toEqual({ path: 'http://test.com/url?abc=def&xyz' });