redirect to external URLs - closes #490

This commit is contained in:
Rich Harris
2018-10-27 12:14:28 -04:00
parent ab52aabd1d
commit e69cb3639a
5 changed files with 66 additions and 8 deletions

View File

@@ -50,6 +50,20 @@ export class AppRunner {
}
});
await this.page.setRequestInterception(true);
this.page.on('request', interceptedRequest => {
if (/example\.com/.test(interceptedRequest.url())) {
interceptedRequest.respond({
status: 200,
contentType: 'text/html',
body: `<h1>external</h1>`
});
} else {
interceptedRequest.continue();
}
});
return {
page: this.page,
base: `http://localhost:${this.port}`,

View File

@@ -1,4 +1,5 @@
<h1>root</h1>
<a href="redirect-from">redirect from</a>
<a href="redirect-to-root">redirect to root</a>
<a href="redirect-to-root">redirect to root</a>
<a href="redirect-to-external">redirect to external</a>

View File

@@ -0,0 +1,9 @@
<h1>unredirected</h1>
<script>
export default {
preload() {
this.redirect(301, 'https://example.com');
}
};
</script>

View File

@@ -14,13 +14,14 @@ describe('redirects', function() {
// helpers
let start: () => Promise<void>;
let prefetchRoutes: () => Promise<void>;
let title: () => Promise<string>;
// hooks
before(async () => {
await build({ cwd: __dirname });
runner = new AppRunner(__dirname, '__sapper__/build/server/server.js');
({ base, page, start, prefetchRoutes } = await runner.start());
({ base, page, start, prefetchRoutes, title } = await runner.start());
});
after(() => runner.end());
@@ -34,7 +35,7 @@ describe('redirects', function() {
);
assert.equal(
await page.$eval('h1', node => node.textContent),
await title(),
'redirected'
);
});
@@ -53,7 +54,7 @@ describe('redirects', function() {
);
assert.equal(
await page.$eval('h1', node => node.textContent),
await title(),
'redirected'
);
});
@@ -67,7 +68,7 @@ describe('redirects', function() {
);
assert.equal(
await page.$eval('h1', node => node.textContent),
await title(),
'root'
);
});
@@ -86,8 +87,41 @@ describe('redirects', function() {
);
assert.equal(
await page.$eval('h1', node => node.textContent),
await title(),
'root'
);
});
it('redirects to external URL on server', async () => {
await page.goto(`${base}/redirect-to-external`);
assert.equal(
page.url(),
`https://example.com/`
);
assert.equal(
await title(),
'external'
);
});
it('redirects to external URL in client', async () => {
await page.goto(base);
await start();
await prefetchRoutes();
await page.click('[href="redirect-to-external"]');
await wait(50);
assert.equal(
page.url(),
`https://example.com/`
);
assert.equal(
await title(),
'external'
);
});
});