let fs = require('fs')
let jst = require('@ndcode/jst')
let less = require('less/lib/less-node')
+let path = require('path')
var stream_buffers = require('stream-buffers')
let url = require('url')
let util = require('util')
)
}
-Server.prototype.get_jst = function(dirname, pathname) {
- return /*await*/ jst(dirname, dirname, pathname, {_server: this})
+Server.prototype.get_jst = function(pathname, root) {
+ return /*await*/ jst(pathname, root, {_server: this})
}
-Server.prototype.get_less = function(dirname, pathname) {
- pathname = dirname + pathname
+Server.prototype.get_less = function(pathname, root) {
+ let dirname = path.posix.dirname(pathname)
return /*await*/ this.build_cache_less.get(
pathname,
async result => {
//plugins: [],
//reUsePluginManager: true,
//rewriteUrls: false,
- rootpathname: this.root//,
+ rootpathname: root//,
//strictImports: false,
//strictUnits: false,
//urlArgs: ''
let site_factory_default = async (server, root) => new Site(server, root)
Server.prototype.respond = async function(request, response, protocol) {
- let sites = await this.get_jst('.', '/_config/sites.jst')
+ let sites = await this.get_jst('_config/sites.jst', '.')
try {
let parsed_url = url.parse(
protocol + '//' + (request.headers.host || 'localhost') + request.url,
return
}
+ let mime_type = this.mime_type_default
+ let i = parsed_url.pathname.lastIndexOf('.')
+ if (i !== -1) {
+ let filetype = parsed_url.pathname.slice(i)
+ if (
+ Object.prototype.hasOwnProperty.call(this.mime_types, filetype)
+ )
+ mime_type = this.mime_types[filetype]
+ }
+
let site = sites[parsed_url.hostname]
site.respond(
{
- mime_type: this.mime_type_default,
+ mime_type: mime_type,
parsed_url: parsed_url,
pathname: parsed_url.pathname,
pathname_pos: 0,
response: response,
request: request,
- status: 200,
site: site
}
)
return /*await*/ this.server.get_json(this.root + pathname)
}
SiteRoot.prototype.get_jst = function(pathname) {
- return /*await*/ this.server.get_jst(this.root, pathname)
+ return /*await*/ this.server.get_jst(this.root + pathname, this.root)
}
SiteRoot.prototype.get_less = function(pathname) {
- return /*await*/ this.server.get_less(this.root, pathname)
+ return /*await*/ this.server.get_less(this.root + pathname, this.root)
}
SiteRoot.prototype.get_text = function(pathname) {
return /*await*/ this.server.get_text(this.root + pathname)
}
SiteRoot.prototype.serve_jst = async function(env, pathname) {
- let jst
+ let template
try {
- jst = await this.get_jst(pathname)
+ template = await this.server.get_jst(pathname, this.root)
}
catch (err) {
- if (err.code !== 'ENOENT')
+ if (!(err instanceof Error) || err.code !== 'ENOENT')
throw err
return false
}
- await jst(env)
+ await template(env)
return true
}
let data
try {
- data = await this.get_less(pathname)
+ data = await this.server.get_less(pathname, this.root)
}
catch (err) {
- if (err.code !== 'ENOENT')
+ if (!(err instanceof Error) || err.code !== 'ENOENT')
throw err
return false
}
- this.serve(env, data, 'less')
+ this.serve(env, 200, data, 'less')
return true
}
SiteRoot.prototype.serve_fs = async function(env, pathname) {
let data
try {
- data = await fs_readFile(this.root + pathname)
+ data = await fs_readFile(pathname)
}
catch (err) {
- if (err.code !== 'ENOENT')
+ if (!(err instanceof Error) || err.code !== 'ENOENT')
throw err
return false
}
- this.serve(env, data, 'fs')
+ this.serve(env, 200, data, 'fs')
return true
}
-
SiteRoot.prototype.serve_zip = async function(env, pathname) {
let zip
try {
- zip = await this.get_zip(pathname)
+ zip = await this.server.get_zip(pathname)
}
catch (err) {
- if (err.code !== 'ENOENT')
+ if (!(err instanceof Error) || err.code !== 'ENOENT')
throw err
return false
}
if (!Object.prototype.hasOwnProperty.call(zip, env.pathname))
return false
- this.serve(env, zip[env.pathname], 'zip')
+ this.serve(env, 200, zip[env.pathname], 'zip')
return true
}
this.die(env, `non-directory filetype "${filetype}" in ${env.pathname}`)
return
}
- env.mime_type = this.server.mime_types[filetype]
env.pathname_pos = i + k // advance to "." at start of filetype
break
}
env.pathname_pos = j
let pathname = env.pathname.slice(0, env.pathname_pos)
- if (await this.serve_jst(env, pathname + '.dir.jst'))
+ if (await this.serve_jst(env, this.root + pathname + '.dir.jst'))
return
let stats
stats = await fs_stat(this.root + pathname)
}
catch (err) {
- if (err.code !== 'ENOENT')
+ if (!(err instanceof Error) || err.code !== 'ENOENT')
throw err
this.die(env, `directory not found ${pathname}`)
return
}
if (
- !await this.serve_jst(env, env.pathname + '.jst') &&
- !await this.serve_less(env, env.pathname + '.less') &&
- !await this.serve_fs(env, env.pathname) &&
- !await this.serve_zip(env, '/_favicon/favicons.zip')
+ !await this.serve_jst(env, this.root + env.pathname + '.jst') &&
+ !await this.serve_less(env, this.root + env.pathname + '.less') &&
+ !await this.serve_fs(env, this.root + env.pathname) &&
+ !await this.serve_zip(env, this.root + '/_favicon/favicons.zip')
) {
this.die(env, `file not found ${env.pathname}`)
}