Compare commits

..
2 Commits
6 changed files with 152 additions and 0 deletions

No files matched your search

+3
View File
@@ -0,0 +1,3 @@
{
"greeting": "Hello %1, What a beautiful day. Server current date and time is %2"
}
+26
View File
@@ -0,0 +1,26 @@
const fs = require("fs");
const path = require("path");
class FileManager {
constructor(baseDir) {
this.baseDir = baseDir;
}
resolve(fileName) {
return path.join(this.baseDir, path.basename(fileName));
}
exists(fileName) {
return fs.existsSync(this.resolve(fileName));
}
append(fileName, text) {
fs.appendFileSync(this.resolve(fileName), `${text}\n`);
}
read(fileName) {
return fs.readFileSync(this.resolve(fileName), "utf8");
}
}
module.exports = FileManager;
+13
View File
@@ -0,0 +1,13 @@
const PI = 3.141592654;
exports.add = (a, b) => {
return a + b
}
exports.subtract = (a, b) => {
return a - b
}
exports.area = (r) => {
return 2*PI*r;
}
+19
View File
@@ -0,0 +1,19 @@
class Utils {
getDate() {
return new Date().toString();
}
format(template, ...values) {
return template.replace(/%(\d+)/g, (match, index) => {
const value = values[Number(index) - 1];
return value === undefined ? match : value;
});
}
escapeHtml(text) {
const entities = {"&": "&amp;", "<": "&lt;", ">": "&gt;", "\"": "&quot;", "'": "&#39;"};
return text.replace(/[&<>"']/g, (char) => entities[char]);
}
}
module.exports = Utils;
+89
View File
@@ -0,0 +1,89 @@
const http = require("http");
const fs = require("fs");
const path = require("path");
const Utils = require("./modules/utils");
const FileManager = require("./modules/fileManager");
const PORT = process.env.PORT || 8000;
class Server {
constructor(port) {
this.port = port;
this.utils = new Utils();
this.files = new FileManager(__dirname);
this.strings = JSON.parse(fs.readFileSync(path.join(__dirname, "lang", "en", "en.json"), "utf8"));
}
start() {
http.createServer((req, res) => this.handleRequest(req, res)).listen(this.port, () => {
console.log(`listening on port :${this.port}`);
});
}
handleRequest(req, res) {
if (req.method !== "GET") {
return this.send(res, 405, "text/plain", "Method not allowed");
}
const url = new URL(req.url, "http://localhost");
try {
if (url.pathname === "/") {
return this.send(res, 200, "text/plain", "Server Status: OK");
}
if (/\/getDate\/?$/.test(url.pathname)) {
return this.handleGetDate(url, res);
}
if (/\/writeFile\/?$/.test(url.pathname)) {
return this.handleWriteFile(url, res);
}
const readMatch = url.pathname.match(/\/readFile\/(.+)$/);
if (readMatch) {
return this.handleReadFile(decodeURIComponent(readMatch[1]), res);
}
return this.send(res, 404, "text/plain", "Not found");
} catch (err) {
return this.send(res, 500, "text/plain", `Server error: ${err.message}`);
}
}
handleGetDate(url, res) {
const name = url.searchParams.get("name");
if (!name) {
return this.send(res, 400, "text/plain", "Missing required query parameter: name");
}
const message = this.utils.format(
this.strings.greeting,
this.utils.escapeHtml(name),
this.utils.getDate()
);
const html = `<!DOCTYPE html><html><body><p style="color: blue;">${message}</p></body></html>`;
return this.send(res, 200, "text/html", html);
}
handleWriteFile(url, res) {
const text = url.searchParams.get("text");
if (text === null) {
return this.send(res, 400, "text/plain", "Missing required query parameter: text");
}
this.files.append("file.txt", text);
return this.send(res, 200, "text/plain", `Appended a new line to file.txt`);
}
handleReadFile(fileName, res) {
if (!this.files.exists(fileName)) {
return this.send(res, 404, "text/plain", `File not found: ${fileName}`);
}
return this.send(res, 200, "text/plain; charset=utf-8", this.files.read(fileName));
}
send(res, status, contentType, body) {
res.writeHead(status, {"Content-Type": contentType});
res.end(body);
}
}
new Server(PORT).start();
+2
View File
@@ -0,0 +1,2 @@
const mo = require("./modules/math");
console.log(`Hello Braeden. The area is ${mo.area(r)}`);