Update to jst.git commit e365ffe, rationalize pathname and mime_type handling
authorNick Downing <nick@ndcode.org>
Fri, 16 Nov 2018 13:18:50 +0000 (00:18 +1100)
committerNick Downing <nick@ndcode.org>
Fri, 16 Nov 2018 13:18:50 +0000 (00:18 +1100)
Server.js
Site.js
SiteDefault.js
SiteRoot.js
package.json
site/index.html.jst

index 8f6f809..682feb3 100644 (file)
--- a/Server.js
+++ b/Server.js
@@ -6,6 +6,7 @@ let emailjs = require('emailjs')
 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')
@@ -61,12 +62,12 @@ Server.prototype.get_json = function(pathname) {
   )
 }
 
-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 => {
@@ -90,7 +91,7 @@ Server.prototype.get_less = function(dirname, pathname) {
           //plugins: [],
           //reUsePluginManager: true,
           //rewriteUrls: false,
-          rootpathname: this.root//,
+          rootpathname: root//,
           //strictImports: false,
           //strictUnits: false,
           //urlArgs: ''
@@ -424,7 +425,7 @@ Server.prototype.redirect = function(response, location, message) {
 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,
@@ -443,16 +444,25 @@ Server.prototype.respond = async function(request, response, protocol) {
       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
       }
     )
diff --git a/Site.js b/Site.js
index be61e9f..cf54612 100644 (file)
--- a/Site.js
+++ b/Site.js
@@ -5,10 +5,10 @@ let Site = function(server) {
   this.socket_io_connect_listeners = [] // later will use this for destruction
 }
 
-Site.prototype.serve = function(env, data, message_from) {
+Site.prototype.serve = function(env, status, data, message_from) {
   this.server.serve(
     env.response,
-    env.status,
+    status,
     env.mime_type,
     data,
     `${env.parsed_url.host} serving ${env.pathname} size ${data.length} from ${message_from}`
index fa06083..8700188 100644 (file)
@@ -15,7 +15,7 @@ SiteDefault.prototype.respond = async function(env) {
     site = await this.get_jst(this.config)
   }
   catch (err) {
-    if (err.code !== 'ENOENT') // error type??
+    if (!(err instanceof Error) || err.code !== 'ENOENT')
       throw err
     // no custom site object, handle the request ourselves
     return SiteRoot.prototype.respond.call(this, env)
index be7adcd..da62f1c 100644 (file)
@@ -22,10 +22,10 @@ SiteRoot.prototype.get_json = function(pathname) {
   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)
@@ -67,16 +67,16 @@ SiteRoot.prototype.modify_json =
   }
 
 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
 }
 
@@ -86,45 +86,44 @@ SiteRoot.prototype.serve_less = async function(env, pathname) {
  
   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
 }
 
@@ -173,14 +172,13 @@ SiteRoot.prototype.respond = async function(env) {
         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
@@ -188,7 +186,7 @@ SiteRoot.prototype.respond = async function(env) {
       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
@@ -205,10 +203,10 @@ SiteRoot.prototype.respond = async function(env) {
   }    
 
   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}`)
   }
index cbd8e83..88d589d 100644 (file)
@@ -7,7 +7,7 @@
   "dependencies": {
     "@ndcode/build_cache": "^0.1.0",
     "@ndcode/json_cache": "^0.1.0",
-    "@ndcode/jst": "^0.1.1",
+    "@ndcode/jst": "^0.1.2",
     "babel-cli": "^6.26.0",
     "commander": "^2.18.0",
     "cookie": "^0.3.1",
index 5658c72..3db710a 100644 (file)
@@ -1,6 +1,7 @@
 return async env => {
   env.site.serve(
     env,
+    200,
     Buffer.from(
       html {
         head {