const http = require("http"); const fs = require("fs"); const path = require("path"); const util = require("util"); const PORT = process.argv[2] || 8080; const __cwd = process.cwd(); const _access = util.promisify(fs.access); const _readdir = util.promisify(fs.readdir); const reqListener = async (req, res) => { console.log(req.url); const fp = path.join(__cwd, req.url); try { // If file does not exist we skill to catch block. await _access(fp, fs.constants.F_OK); // If path is a directory, we show directory listing. // TODO: The only exception is the root directory, in which // index.html will be tried first before falling back // to directory list. if (fs.statSync(fp).isDirectory()) { let files = await _readdir(fp); let d_listing = "
";
d_listing += `../\n`;
files.forEach(file => {
try {
fs.statSync(path.join(fp, file)).isDirectory()
? d_listing += `${file}/`
: d_listing += `${file}`;
} catch (e) {
console.error(e.message);
d_listing += `${file}`;
}
d_listing += "\n";
});
d_listing += "";
res.writeHead(200, {
"Content-Type": "text/html"
});
return res.end(d_listing);
} else {
const readable = fs.createReadStream(fp);
res.writeHead(200, {
"Content-Length": fs.statSync(fp).size,
});
readable.pipe(res);
}
} catch (e) {
console.log(e);
res.writeHead(404);
res.end(":(");
}
};
const server = http.createServer(reqListener);
server.listen(PORT, () => {
console.log(`Serving on http://localhost:${PORT}`);
});