diff --git a/hw4/Claudio_Maggioni/server.js b/hw4/Claudio_Maggioni/server.js index 6878a37..e051606 100755 --- a/hw4/Claudio_Maggioni/server.js +++ b/hw4/Claudio_Maggioni/server.js @@ -1,9 +1,5 @@ #!/usr/bin/env node // vim: set ts=2 sw=2 et tw=80: -/* - * Basic node.js HTTP server - * - */ const http = require('http'); const url = require('url'); @@ -11,10 +7,89 @@ const fs = require('fs'); const routes = Object.create(null); -// Configure your routing table here... -//routes['URL'] = function; +function error(res, code, text = '') { + res.writeHead(code, { 'Content-Type': 'text/html' }); + res.end(` + +
+ +${text}
+SA3 - HW4
+ + `); +} -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(` + + + +