this.root = root
}
-Site.prototype.app = async function(host, req, res, protocol) {
- // parse the pathname portion of url
- // this is actually cheating since it's not a complete url
- let parsed_url = url.parse(req.url, true)
+Site.prototype.respond = async function(request, response, parsed_url) {
let path = parsed_url.pathname.split('/')
// path must begin with /
if (path.length === 0 || path[0].length) {
- server.die(res)
+ server.die(response)
return
}
for (let i = 1; i < path.length - 1; ++i) {
dir_name += '/' + path[i]
if (path[i].length === 0 || path[i].charAt(0) === '.') {
- console.log(host, 'bad path component', dir_name)
- server.die(res)
+ console.log(parsed_url.host, 'bad path component', dir_name)
+ server.die(response)
return
}
let stats
catch (err2) {
if (err2.code !== 'ENOENT')
throw err2
- console.log(host, 'directory not found', dir_name)
- server.die(res)
+ console.log(parsed_url.host, 'directory not found', dir_name)
+ server.die(response)
return
}
}
if (!stats.isDirectory()) {
- console.log(host, 'not directory', dir_name)
- server.die(res)
+ console.log(parsed_url.host, 'not directory', dir_name)
+ server.die(response)
return
}
}
if (file_name === '') {
path[path.length - 1] = 'index.html'
path = path.join('/')
- console.log(host, 'server.redirecting', parsed_url.pathname, 'to', path)
- server.redirect(res, path + (parsed_url.search || ''))
+ console.log(parsed_url.host, 'server.redirecting', parsed_url.pathname, 'to', path)
+ server.redirect(response, path + (parsed_url.search || ''))
return
}
let page = path.join('/')
try {
let data = await fs_readFile(temp)
console.log(
- host,
+ parsed_url.host,
'serving',
temp,
'length',
data.length,
'from pub'
)
- server.serve(res, 200, mime_type, data)
+ server.serve(response, 200, mime_type, data)
return
}
catch (err) {
try {
let data = await fs_readFile(this.root + temp)
console.log(
- host,
+ parsed_url.host,
'serving',
temp,
'length',
data.length,
'from pub'
)
- server.serve(res, 200, mime_type, data)
+ server.serve(response, 200, mime_type, data)
return
}
catch (err) {
let _out = []
await template(
{
- cookies: cookie.parse(req.headers.cookie || ''),
- lang: 'en',
- host: host,
- method: req.method,
- page: page,
- query: parsed_url.query,
- read_stream: req,
- set_cookie: (key, value, expires, path) => {
- res.setHeader(
- 'Set-Cookie',
- key +
- '=' +
- value +
- '; expires=' +
- expires +
- '; path=' +
- path +
- ';'
- )
- },
+ parsed_url: parsed_url,
+ response: response,
+ request: request,
site: this
},
_out
)
let data = Buffer.from(_out.join(''))
console.log(
- host,
+ parsed_url.host,
'serving',
temp,
'length',
data.length,
'from js'
)
- server.serve(res, 200, mime_type, data)
+ server.serve(response, 200, mime_type, data)
return
}
break
try {
let data = await this.get_less(temp, dir_name)
console.log(
- host,
+ parsed_url.host,
'serving',
temp,
'length',
data.length,
'from less'
)
- server.serve(res, 200, mime_type, data)
+ server.serve(response, 200, mime_type, data)
return
}
catch (err) {
if (Object.prototype.hasOwnProperty.call(favicons, page)) {
let data = favicons[page]
console.log(
- host,
+ parsed_url.host,
'serving',
page,
'length',
data.length,
'from favicons'
)
- server.serve(res, 200, mime_type, data)
+ server.serve(response, 200, mime_type, data)
return
}
- console.log(host, 'file not found', page)
- server.die(res)
+ console.log(parsed_url.host, 'file not found', page)
+ server.die(response)
}
Site.prototype.get_email = function(path) {
path = this.root + path
return resources.build_cache_email.get(
path,
- async result => {
+ async responseult => {
console.log('getting', path, 'as email')
- result.value = emailjs.server.connect(
+ responseult.value = emailjs.server.connect(
JSON.parse(await fs_readFile(path))
)
}
path = this.root + path
return resources.build_cache_json.get(
path,
- async result => {
+ async responseult => {
console.log('getting', path, 'as json')
- result.value = JSON.parse(await fs_readFile(path))
+ responseult.value = JSON.parse(await fs_readFile(path))
}
)
}
path = this.root + path
return resources.build_cache_less.get(
path,
- async result => {
+ async responseult => {
console.log('getting', path, 'as less')
let render = await less.render(
await fs_readFile(path, {encoding: 'utf-8'}),
{
//color: true,
- //compress: false,
+ //compresponses: false,
//depends: false,
filename: path,
//globalVars: null,
//urlArgs: ''
}
)
- result.deps.concat(render.imports)
- result.value = Buffer.from(render.css)
+ responseult.deps.concat(render.imports)
+ responseult.value = Buffer.from(render.css)
}
)
}
path = this.root + path
return resources.build_cache_text.get(
path,
- async result => {
+ async responseult => {
console.log('getting', path, 'as text')
- result.value = await fs_readFile(path, {encoding: 'utf-8'})
+ responseult.value = await fs_readFile(path, {encoding: 'utf-8'})
}
)
}
path = this.root + path
return resources.build_cache_zet.get(
path,
- async result => {
+ async responseult => {
console.log('getting', path, 'as zet')
- result.deps = [
+ responseult.deps = [
path + '.map.0',
path + '.param.0',
path + '.v.0',
path + '.vocab.0'
]
- result.value = new zetjs.Index(path)
+ responseult.value = new zetjs.Index(path)
}
)
}
path = this.root + path
return resources.build_cache_zip.get(
path,
- async result => {
+ async responseult => {
console.log('getting', path, 'as zip')
- result.value = {}
+ responseult.value = {}
let zipfile = await yauzl_open(path, {autoClose: false})
let entries = []
await new Promise(
- (resolve, reject) => {
+ (responseolve, reject) => {
zipfile.
on('entry', entry => {entries.push(entry)}).
- on('end', () => resolve())
+ on('end', () => responseolve())
}
)
for (let i = 0; i < entries.length; ++i) {
let read_stream = await new Promise(
- (resolve, reject) => {
+ (responseolve, reject) => {
zipfile.openReadStream(
entries[i],
(err, stream) => {
if (err)
reject(err)
- resolve(stream)
+ responseolve(stream)
}
)
}
)
let write_stream = new stream_buffers.WritableStreamBuffer()
let data = new Promise(
- (resolve, reject) => {
+ (responseolve, reject) => {
write_stream.
- on('finish', () => {resolve(write_stream.getContents())}).
+ on('finish', () => {responseolve(write_stream.getContents())}).
on('error', () => {reject()})
}
)
let path = '/' + entries[i].fileName
data = await data
console.log('entry path', path, 'size', data.length)
- result.value[path] = data
+ responseult.value[path] = data
}
await zipfile.close()
}
let assert = require('assert')
let config = require('./config')
let js_template = require('js_template')
+let url = require('url')
let caching = false
let set_caching = value => {
caching = value
}
-let serve = (res, status, mime_type, data) => {
- res.statusCode = status
+let serve = (response, status, mime_type, data) => {
+ response.statusCode = status
// html files will be direct recipient of links/bookmarks so can't have
// a long lifetime, other files like css or images are often large files
// and won't change frequently (but we'll need cache busting eventually)
if (caching && mime_type !== config.mime_types_html)
- res.setHeader('Cache-Control', 'max-age=3600')
- res.setHeader('Content-Type', mime_type)
- res.setHeader('Content-Length', data.length)
- res.end(data)
+ response.setHeader('Cache-Control', 'max-age=3600')
+ response.setHeader('Content-Type', mime_type)
+ response.setHeader('Content-Length', data.length)
+ response.end(data)
}
-let die = res => {
+let die = response => {
let body = '<html><body>Page not found</body></html>'
- serve(res, 404, config.mime_type_html, Buffer.from(body))
+ serve(response, 404, config.mime_type_html, Buffer.from(body))
}
-let redirect = (res, location) => {
- res.statusCode = 301
- res.setHeader('Location', location)
- res.end('Redirecting to ' + location)
+let redirect = (response, location) => {
+ response.statusCode = 301
+ response.setHeader('Location', location)
+ response.end('Redirecting to ' + location)
}
let site_cache = {}
let site_factory_default = async root => new Site(root)
-let app = async (req, res, protocol) => {
- await config.refresh()
+let respond = async (request, response, protocol) => {
try {
- let host = req.headers.host || 'localhost'
- let temp = host.indexOf(':')
- let port_suffix = temp === -1 ? '' : host.substring(temp)
- host = host.substring(
- 0,
- host.length - port_suffix.length
+ await config.refresh()
+ let parsed_url = url.parse(
+ protocol + '//' + (request.headers.host || 'localhost') + request.url,
+ true
)
- if (!Object.prototype.hasOwnProperty.call(config.sites, host)) {
- console.log('nonexistent site', host)
- die(res)
+ //console.log('parsed_url', parsed_url)
+
+ if (!Object.prototype.hasOwnProperty.call(config.sites, parsed_url.hostname)) {
+ console.log('nonexistent site', parsed_url.hostname)
+ die(response)
return
}
- temp = config.sites[host]
+ let temp = config.sites[parsed_url.hostname]
switch (temp.type) {
case 'redirect':
- let new_domain = temp.domain
- console.log('redirecting', host, 'to', new_domain)
- redirect(res, protocol + '://' + new_domain + port_suffix + req.url)
+ let hostname = temp.domain
+ if (parsed_url.port !== undefined)
+ hostname += ':' + parsed_url.port
+ console.log('redirecting', parsed_url.host, 'to', hostname)
+ redirect(response, parsed_url.protocol + '//' + hostname + request.url)
break
case 'site':
let site_factory
}
site_cache[temp.root] = site
}
- await site.object.app(host, req, res, protocol)
+ await site.object.respond(request, response, parsed_url)
break
default:
assert(false)
let message = (err.stack || err.message).toString()
console.error(message)
let body = '<html><body><pre>' + message + '</pre></body></html>'
- serve(res, 500, config.mime_type_html, Buffer.from(body, 'utf8'))
+ serve(response, 500, config.mime_type_html, Buffer.from(body, 'utf8'))
}
}
exports.serve = serve
exports.die = die
exports.redirect = redirect
-exports.app = app
+exports.respond = respond