1 let assert = require('assert')
2 let config = require('./config')
3 let site = require('./site')
6 let set_caching = value => {
10 let serve = (res, status, mime_type, data) => {
11 res.statusCode = status
12 // html files will be direct recipient of links/bookmarks so can't have
13 // a long lifetime, other files like css or images are often large files
14 // and won't change frequently (but we'll need cache busting eventually)
15 if (caching && mime_type !== config.mime_types_html)
16 res.setHeader('Cache-Control', 'max-age=3600')
17 res.setHeader('Content-Type', mime_type)
18 res.setHeader('Content-Length', data.length)
23 let body = '<html><body>Page not found</body></html>'
24 serve(res, 404, config.mime_type_html, Buffer.from(body))
27 let redirect = (res, location) => {
29 res.setHeader('Location', location)
30 res.end('Redirecting to ' + location)
33 let app = async (req, res, protocol) => {
34 await config.refresh()
36 let domain_name = req.headers.host || 'localhost'
37 let temp = domain_name.indexOf(':')
38 let port_suffix = temp === -1 ? '' : domain_name.substring(temp)
39 domain_name = domain_name.substring(
41 domain_name.length - port_suffix.length
43 if (!Object.prototype.hasOwnProperty.call(config.sites, domain_name)) {
44 console.log('nonexistent site', domain_name)
48 temp = config.sites[domain_name]
51 let new_domain = temp.domain
52 console.log('redirecting', domain_name, 'to', new_domain)
53 redirect(res, protocol + '://' + new_domain + port_suffix + req.url)
56 await site.app(domain_name, temp.root, req, res, protocol)
63 let message = (err.stack || err.message).toString()
64 console.error(message)
65 let body = '<html><body><pre>' + message + '</pre></body></html>'
66 serve(res, 500, config.mime_type_html, Buffer.from(body, 'utf8'))
70 exports.set_caching = set_caching
73 exports.redirect = redirect