hw4: ex3
This commit is contained in:
parent
4264218206
commit
2dcbefb7db
1 changed files with 89 additions and 16 deletions
|
@ -1,9 +1,5 @@
|
||||||
#!/usr/bin/env node
|
#!/usr/bin/env node
|
||||||
// vim: set ts=2 sw=2 et tw=80:
|
// vim: set ts=2 sw=2 et tw=80:
|
||||||
/*
|
|
||||||
* Basic node.js HTTP server
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
const http = require('http');
|
const http = require('http');
|
||||||
const url = require('url');
|
const url = require('url');
|
||||||
|
@ -11,10 +7,89 @@ const fs = require('fs');
|
||||||
|
|
||||||
const routes = Object.create(null);
|
const routes = Object.create(null);
|
||||||
|
|
||||||
// Configure your routing table here...
|
function error(res, code, text = '') {
|
||||||
//routes['URL'] = function;
|
res.writeHead(code, { 'Content-Type': 'text/html' });
|
||||||
|
res.end(`<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset='utf-8'>
|
||||||
|
<title>Error ${code}</title>
|
||||||
|
</head>
|
||||||
|
<body style="text-align: center">
|
||||||
|
<h1>Error ${code}</h1>
|
||||||
|
<p>${text}</p>
|
||||||
|
<hr>
|
||||||
|
<p>SA3 - HW4</p>
|
||||||
|
</body>
|
||||||
|
</html>`);
|
||||||
|
}
|
||||||
|
|
||||||
routes['files'] = (req, res) => {
|
function fileData(reqUrl, prefix, wantExt = true) {
|
||||||
|
const uri = url.parse(reqUrl).pathname.substring(prefix.length);
|
||||||
|
const file = __dirname + '/NodeStaticFiles' + uri;
|
||||||
|
const name = file.substring(file.lastIndexOf('/') + 1);
|
||||||
|
const ext = wantExt ? name.substring(name.indexOf('.') + 1) : null;
|
||||||
|
|
||||||
|
return {
|
||||||
|
uri: !uri ? '/' : uri,
|
||||||
|
file: file,
|
||||||
|
name: name,
|
||||||
|
ext: ext
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
routes['explore'] = (req, res) => {
|
||||||
|
if (req.method != 'GET') {
|
||||||
|
error(res, 405, 'Use this URL with only GET requests');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const { uri, file, name } = fileData(req.url, '/explore', false);
|
||||||
|
|
||||||
|
fs.readdir(file, { withFileTypes: true }, (err, dir) => {
|
||||||
|
if (err) {
|
||||||
|
error(res, 404, 'Directory not found');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const list = [{ name: '.', path: '/explore' + uri }];
|
||||||
|
if (uri != '/') {
|
||||||
|
const parentUri = uri.substring(0, uri.length - name.length - 1);
|
||||||
|
list.push({ name: '..', path: '/explore' + parentUri });
|
||||||
|
}
|
||||||
|
for (const e of dir) {
|
||||||
|
list.push({
|
||||||
|
name: e.name,
|
||||||
|
dir: !e.isFile(),
|
||||||
|
path: ((e.isFile() ? '/file' : '/explore') + uri +
|
||||||
|
(uri == '/' ? '' : '/') + e.name)
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log(list);
|
||||||
|
|
||||||
|
res.writeHead(200, { 'Content-Type': 'text/html' });
|
||||||
|
res.write(`<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<title>${uri} [DIR]</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<h1>${uri} [DIR]</h1>
|
||||||
|
<ul>`);
|
||||||
|
for (const { name, dir, path } of list) {
|
||||||
|
res.write(`<li>
|
||||||
|
<a href="${path}">${name}${dir ? ' [DIR]' : ''}</a>
|
||||||
|
</li>`);
|
||||||
|
}
|
||||||
|
res.end(`</ul>
|
||||||
|
</body>
|
||||||
|
</html>`);
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
routes['file'] = (req, res) => {
|
||||||
const FILE_TYPES = {
|
const FILE_TYPES = {
|
||||||
html: 'text/html',
|
html: 'text/html',
|
||||||
css: 'text/css',
|
css: 'text/css',
|
||||||
|
@ -32,17 +107,16 @@ routes['files'] = (req, res) => {
|
||||||
zip: 'application/zip'
|
zip: 'application/zip'
|
||||||
};
|
};
|
||||||
|
|
||||||
const uri = url.parse(req.url).pathname.substring('/files'.length);
|
if (req.method != 'GET') {
|
||||||
const file = __dirname + '/NodeStaticFiles' + uri;
|
error(res, 405, 'Use this URL with only GET requests');
|
||||||
const name = file.substring(file.lastIndexOf('/') + 1);
|
return;
|
||||||
const ext = name.substring(name.indexOf('.') + 1);
|
}
|
||||||
|
|
||||||
console.log(file, name, ext);
|
const { file, name, ext } = fileData(req.url, '/file');
|
||||||
|
|
||||||
fs.readFile(file, (err, data) => {
|
fs.readFile(file, (err, data) => {
|
||||||
if (err) {
|
if (err) {
|
||||||
res.writeHead(404, { 'Content-Type': 'text/html' });
|
error(res, 404, 'File not found: ' + JSON.stringify(err));
|
||||||
res.end('File not found: ' + JSON.stringify(err));
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -62,8 +136,7 @@ function onRequest(req, res) {
|
||||||
if (typeof routes[uri] === 'function') {
|
if (typeof routes[uri] === 'function') {
|
||||||
routes[uri](req, res);
|
routes[uri](req, res);
|
||||||
} else {
|
} else {
|
||||||
res.writeHead(404);
|
error(res, 404, 'Path not found');
|
||||||
res.end();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Reference in a new issue