diff --git a/lib/src/start.js b/lib/src/start.js index b727e4c..5778e47 100644 --- a/lib/src/start.js +++ b/lib/src/start.js @@ -3,12 +3,14 @@ const { ifElse } = require('crocks/logic') const { pipe } = require('crocks/helpers') const { map } = require('crocks/pointfree') const finalhandler = require('finalhandler') +const fs = require('fs') const http = require('http') const https = require('https') const mime = require('mime') const os = require('os') const path = require('path') const serveStatic = require('serve-static') +const { URL } = require('url') const ws = require('ws') const { update, readFile, notExists, writeFile, isObj, hasProp } = require('./utils') const { fileNotFound, serverStarted } = require('./messages') @@ -90,6 +92,7 @@ function getRequestType ({ pathname, fileType }, { proxyPrefix, pushstate }) { return PROXY_TYPE } else if ( isRoot({ pathname, pushstate, fileType }) || + fileType === null || fileType === 'text/html' ) { return CONTENT_TYPE @@ -106,7 +109,8 @@ function getRequestType ({ pathname, fileType }, { proxyPrefix, pushstate }) { * This function takes in the path from the request and the model and returns the needed values to finish running the request. **/ function parseUrl (pathname, model) { - const fileType = pipe(path.extname, mime.getType)(pathname) + const fileExists = fs.existsSync(path.join(model.dir, pathname)) + const fileType = fileExists ? pipe(path.extname, mime.getType)(pathname) : null const requestType = getRequestType({ pathname, fileType }, model) const rootPath = `${model.dir}/${model.startPage}` const fullPath = `${model.dir}${pathname}` @@ -172,9 +176,10 @@ function handler (model) { const serve = serveStatic(model.dir, { index: ['index.html', 'index.htm'] }) return function (req, res) { - const url = parseUrl(req.url, model) + const url = new URL(req.url, `http://${req.headers.host}`) + const urlInfo = parseUrl(url.pathname, model) - if (proxy && url.isType(PROXY_TYPE)) { + if (proxy && urlInfo.isType(PROXY_TYPE)) { req.url = req.url.replace(model.proxyPrefix, '') proxy.web(req, res, { target: model.proxyHost, @@ -186,11 +191,11 @@ function handler (model) { res.writeHead(502) res.end('502 Bad Gateway') }) - } else if (url.isType(CONTENT_TYPE)) { - readFile(url.getPath, 'utf8') - .alt(readFile(url.rootpath, 'utf8')) + } else if (urlInfo.isType(CONTENT_TYPE)) { + readFile(urlInfo.getPath, 'utf8') + .alt(readFile(urlInfo.rootPath, 'utf8')) .fork(resolveNotFound(res), resolveWith(model.reload, res)) - } else if (url.isType(RELOAD_TYPE)) { + } else if (urlInfo.isType(RELOAD_TYPE)) { readFile(RELOAD_FILE, 'utf8') .map(file => file.replace(`'{{verbose}}'`, `${model.verbose}`)) .map(file => file.replace(`'{{reload}}'`, `${model.reload}`))