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

@@ -3,7 +3,7 @@ import * as path from 'path';
import cookie from 'cookie';
import devalue from 'devalue';
import fetch from 'node-fetch';
import { URL } from 'url';
import { URL, resolve } from 'url';
import { build_dir, dev, src_dir, IGNORE } from '../placeholders';
import { Manifest, Page, Props, Req, Res, Store } from './types';
@@ -160,7 +160,7 @@ export function get_page_handler(
try {
if (redirect) {
const location = `${req.baseUrl}/${redirect.location}`;
const location = resolve(req.baseUrl || '/', redirect.location);
res.statusCode = redirect.statusCode;
res.setHeader('Location', location);

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'
);
});
});