1 |
|
2 |
|
3 |
|
4 |
|
5 |
|
6 |
|
7 |
|
8 |
|
9 | const url = require('url')
|
10 | const render_app = require('app-index').render
|
11 | const production_settings = require('production-settings.json')
|
12 | const rewrites = FAB_REWRITES
|
13 | const mime = require('mime-types')
|
14 |
|
15 | const getContentType = pathname => {
|
16 | const mimeType = mime.lookup(pathname)
|
17 | return (mimeType && mime.contentType(mimeType)) || 'text/html; charset=utf-8'
|
18 | }
|
19 |
|
20 | const excludedHeaders = new Set([
|
21 | 'cache-control',
|
22 | 'connection',
|
23 | 'expect',
|
24 | 'keep-alive',
|
25 | 'proxy-authenticate',
|
26 | 'proxy-authorization',
|
27 | 'proxy-connection',
|
28 | 'trailer',
|
29 | 'upgrade',
|
30 | 'x-accel-buffering',
|
31 | 'x-accel-charset',
|
32 | 'x-accel-limit-rate',
|
33 | 'x-accel-redirect',
|
34 | 'x-cache',
|
35 | 'x-forwarded-proto',
|
36 | 'x-real-ip'
|
37 | ])
|
38 | const excludedHeaderPrefixes = [/^x-amz-cf-/i, /^x-amzn-/i, /^x-edge-/i]
|
39 |
|
40 | const render = async (req, settings) => {
|
41 | const parsed = url.parse(req.url)
|
42 | const { path, protocol, host } = parsed
|
43 |
|
44 | const rewrite = rewrites[path]
|
45 | if (rewrite) {
|
46 | const response = await fetch(`${protocol}//${host}${rewrite}`)
|
47 |
|
48 |
|
49 | const headers = {}
|
50 | for (const [header, value] of response.headers.entries()) {
|
51 | if (excludedHeaders.has(header.toLowerCase())) continue
|
52 | if (excludedHeaderPrefixes.some(prefix => prefix.exec(header))) continue
|
53 | headers[header] = value
|
54 | }
|
55 |
|
56 |
|
57 | if (!headers['content-type']) headers['content-type'] = getContentType(path)
|
58 |
|
59 | return new Response(await response.body, {
|
60 | status: response.status,
|
61 | statusText: response.statusText,
|
62 | headers
|
63 | })
|
64 | }
|
65 | return await render_app(req, settings)
|
66 | }
|
67 |
|
68 | module.exports = {
|
69 | render,
|
70 | getProdSettings() {
|
71 | return production_settings
|
72 | }
|
73 | }
|