mirror of
https://github.com/kevin-DL/sapper.git
synced 2026-01-21 23:05:02 +00:00
redirect to external URLs - closes #490
This commit is contained in:
@@ -3,7 +3,7 @@ import * as path from 'path';
|
|||||||
import cookie from 'cookie';
|
import cookie from 'cookie';
|
||||||
import devalue from 'devalue';
|
import devalue from 'devalue';
|
||||||
import fetch from 'node-fetch';
|
import fetch from 'node-fetch';
|
||||||
import { URL } from 'url';
|
import { URL, resolve } from 'url';
|
||||||
import { build_dir, dev, src_dir, IGNORE } from '../placeholders';
|
import { build_dir, dev, src_dir, IGNORE } from '../placeholders';
|
||||||
import { Manifest, Page, Props, Req, Res, Store } from './types';
|
import { Manifest, Page, Props, Req, Res, Store } from './types';
|
||||||
|
|
||||||
@@ -160,7 +160,7 @@ export function get_page_handler(
|
|||||||
|
|
||||||
try {
|
try {
|
||||||
if (redirect) {
|
if (redirect) {
|
||||||
const location = `${req.baseUrl}/${redirect.location}`;
|
const location = resolve(req.baseUrl || '/', redirect.location);
|
||||||
|
|
||||||
res.statusCode = redirect.statusCode;
|
res.statusCode = redirect.statusCode;
|
||||||
res.setHeader('Location', location);
|
res.setHeader('Location', location);
|
||||||
|
|||||||
@@ -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 {
|
return {
|
||||||
page: this.page,
|
page: this.page,
|
||||||
base: `http://localhost:${this.port}`,
|
base: `http://localhost:${this.port}`,
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
<h1>root</h1>
|
<h1>root</h1>
|
||||||
|
|
||||||
<a href="redirect-from">redirect from</a>
|
<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>
|
||||||
9
test/apps/redirects/src/routes/redirect-to-external.html
Normal file
9
test/apps/redirects/src/routes/redirect-to-external.html
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
<h1>unredirected</h1>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
export default {
|
||||||
|
preload() {
|
||||||
|
this.redirect(301, 'https://example.com');
|
||||||
|
}
|
||||||
|
};
|
||||||
|
</script>
|
||||||
@@ -14,13 +14,14 @@ describe('redirects', function() {
|
|||||||
// helpers
|
// helpers
|
||||||
let start: () => Promise<void>;
|
let start: () => Promise<void>;
|
||||||
let prefetchRoutes: () => Promise<void>;
|
let prefetchRoutes: () => Promise<void>;
|
||||||
|
let title: () => Promise<string>;
|
||||||
|
|
||||||
// hooks
|
// hooks
|
||||||
before(async () => {
|
before(async () => {
|
||||||
await build({ cwd: __dirname });
|
await build({ cwd: __dirname });
|
||||||
|
|
||||||
runner = new AppRunner(__dirname, '__sapper__/build/server/server.js');
|
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());
|
after(() => runner.end());
|
||||||
@@ -34,7 +35,7 @@ describe('redirects', function() {
|
|||||||
);
|
);
|
||||||
|
|
||||||
assert.equal(
|
assert.equal(
|
||||||
await page.$eval('h1', node => node.textContent),
|
await title(),
|
||||||
'redirected'
|
'redirected'
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
@@ -53,7 +54,7 @@ describe('redirects', function() {
|
|||||||
);
|
);
|
||||||
|
|
||||||
assert.equal(
|
assert.equal(
|
||||||
await page.$eval('h1', node => node.textContent),
|
await title(),
|
||||||
'redirected'
|
'redirected'
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
@@ -67,7 +68,7 @@ describe('redirects', function() {
|
|||||||
);
|
);
|
||||||
|
|
||||||
assert.equal(
|
assert.equal(
|
||||||
await page.$eval('h1', node => node.textContent),
|
await title(),
|
||||||
'root'
|
'root'
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
@@ -86,8 +87,41 @@ describe('redirects', function() {
|
|||||||
);
|
);
|
||||||
|
|
||||||
assert.equal(
|
assert.equal(
|
||||||
await page.$eval('h1', node => node.textContent),
|
await title(),
|
||||||
'root'
|
'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'
|
||||||
|
);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
Reference in New Issue
Block a user