hackdoor
Version:
##
53 lines (47 loc) • 1.48 kB
JavaScript
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}文件不存在`)
}
}