UNPKG

hackdoor

Version:

##

53 lines (47 loc) 1.48 kB
const promisify = require('util').promisify const path = require('path') const fs = require('fs') const handlebars = require('handlebars') const { root, compressRule } = require('../config') const mineType = require('./mine') const compress = require('./compress') const isFresh = require('./cache') const stat = promisify(fs.stat) const readdir = promisify(fs.readdir) const dirPath = path.join(__dirname, '../views/dir.html') const source = fs.readFileSync(dirPath, 'utf-8') const template = handlebars.compile(source) module.exports = async (req, res, filePath) => { try { const stats = await stat(filePath) if (stats.isFile()) { const contentType = mineType(filePath) res.setHeader('Content-Type', contentType) if (isFresh(req, res, stats)) { res.statusCode = 304 res.end() return } res.statusCode = 200 let rs = fs.createReadStream(filePath) if (compressRule.test(filePath)) { rs = compress(req, res, rs) } rs.pipe(res) } else if (stats.isDirectory()) { const files = await readdir(filePath) res.statusCode = 200 res.setHeader('Content-Type', 'text/html') const data = { files, title: path.basename(filePath), dir: path.relative(root, filePath) } res.end(template(data)) } } catch (e) { res.statusCode = 404 res.setHeader('Content-Type', 'text/plain') res.end(`${filePath}文件不存在`) } }