From 64b4940001be7c6825ab1dd773d20e0a2bd1f7ab Mon Sep 17 00:00:00 2001 From: vexsmart Date: Wed, 18 Mar 2026 18:14:00 -0300 Subject: [PATCH] task solution --- src/createServer.js | 73 +++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 71 insertions(+), 2 deletions(-) diff --git a/src/createServer.js b/src/createServer.js index 1cf1dda..04530a7 100644 --- a/src/createServer.js +++ b/src/createServer.js @@ -1,8 +1,77 @@ 'use strict'; +const http = require('http'); +const fs = require('fs'); +const path = require('path'); + function createServer() { - /* Write your code here */ - // Return instance of http.Server class + const server = http.createServer((req, res) => { + const protectedUrl = new URL(req.url, `http://${req.headers.host}`); + const url = protectedUrl.pathname; + + if (url === '/file' || url === '/file/') { + const indexFilePath = path.join(__dirname, '../public/index.html'); + + fs.readFile(indexFilePath, (err, data) => { + if (err) { + res.statusCode = 404; + res.setHeader('Content-Type', 'text/plain'); + res.end('Not Found'); + + return; + } + res.statusCode = 200; + res.setHeader('Content-Type', 'text/plain'); + res.end(data); + }); + + return; + } + + if (!url.startsWith('/file/')) { + res.statusCode = 400; + res.setHeader('Content-Type', 'text/plain'); + res.end('Bad Request'); + + return; + } + + const relativePath = url.slice(6); + + if (relativePath.includes('..')) { + res.statusCode = 400; + res.setHeader('Content-Type', 'text/plain'); + res.end('Bad Request'); + + return; + } + + if (relativePath.includes('//')) { + res.statusCode = 404; + res.setHeader('Content-Type', 'text/plain'); + res.end('Not Found'); + + return; + } + + const filePath = path.join(__dirname, '../public', relativePath); + + fs.readFile(filePath, (err, data) => { + if (err) { + res.statusCode = 404; + res.setHeader('Content-Type', 'text/plain'); + res.end('Not Found'); + + return; + } + + res.statusCode = 200; + res.setHeader('Content-Type', 'text/plain'); + res.end(data); + }); + }); + + return server; } module.exports = {