From d6d5f85d1ab78fb37a16201c10bf3468075cb6ad Mon Sep 17 00:00:00 2001 From: Leonetienne Date: Fri, 8 Apr 2022 18:09:52 +0200 Subject: [PATCH] Server capable of serving files --- .gitignore | 3 +++ .nvmrc | 1 + package-lock.json | 13 ++++++++++ package.json | 15 ++++++++++++ server.js | 60 +++++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 92 insertions(+) create mode 100644 .gitignore create mode 100644 .nvmrc create mode 100644 package-lock.json create mode 100644 package.json create mode 100755 server.js diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..2003b28 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +/downloads/ +*index-*.html +/node_modules/ diff --git a/.nvmrc b/.nvmrc new file mode 100644 index 0000000..5d6e794 --- /dev/null +++ b/.nvmrc @@ -0,0 +1 @@ +v14.16.1 diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..5d49f4f --- /dev/null +++ b/package-lock.json @@ -0,0 +1,13 @@ +{ + "name": "sellery", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "http": { + "version": "0.0.1-security", + "resolved": "https://registry.npmjs.org/http/-/http-0.0.1-security.tgz", + "integrity": "sha512-RnDvP10Ty9FxqOtPZuxtebw1j4L/WiqNMDtuc1YMH1XQm5TgDRaR1G9u8upL6KD1bXHSp9eSXo/ED+8Q7FAr+g==" + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..a8ec756 --- /dev/null +++ b/package.json @@ -0,0 +1,15 @@ +{ + "name": "sellery", + "version": "1.0.0", + "description": "A password-secured webserver", + "main": "server.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1", + "start": "node server.js" + }, + "author": "Leon Etienne", + "license": "BSD-2-Clause", + "dependencies": { + "http": "0.0.1-security" + } +} diff --git a/server.js b/server.js new file mode 100755 index 0000000..57f1fab --- /dev/null +++ b/server.js @@ -0,0 +1,60 @@ +#!/home/menethil/.nvm/versions/node/v14.16.1/bin/node + +var http = require('http'); +var fs = require('fs'); +var path = require('path'); + +const contentTypes = { + '.html': 'text/html', + '.css': 'text/css', + '.js': 'application/javascript', + '.jpg': 'image/jpeg', + '.jpeg': 'image/jpeg', + '.png': 'image/png', + '.webp': 'image/webp', + '.bmp': 'image/bmp', + '.svg': 'image/svg+xml', + '.ico': 'image/x-icon', + '.mp4': 'video/mp4', + '.webm': 'video/webm', +}; + +var server = http.createServer(function (request, response) { + // Handle requests here... + + // Fetch requested file + fs.readFile(__dirname + request.url, function (error, data) { + if(!error) { + const mimetype = path.extname(request.url); + if (!(typeof mimetype === 'undefined')) { + + response.writeHead(200, { + 'Content-Type': mimetype + }); + response.end(data); + return; + } else { + response.writeHead(500, { + 'Content-Type': 'text/html' + }); + + console.error('Unknown file mime type for file: ' + __dirname + request.url); + response.end('Unknown file mime type.'); + return; + } + } else { + response.writeHead(404, { + 'Content-Type': 'text/html' + }); + + console.error('File not found: ' + JSON.stringify(error)); + response.end('File not found.'); + return; + } + }); +}); + +const port = 80; +server.listen(port); +console.log('Node.js sellery server running and listening to port ' + port); +