diff --git a/package.json b/package.json index 73e02a4..9234166 100644 --- a/package.json +++ b/package.json @@ -18,7 +18,7 @@ "devDependencies": { "@faker-js/faker": "^8.4.1", "@mate-academy/eslint-config": "latest", - "@mate-academy/scripts": "^1.8.6", + "@mate-academy/scripts": "^2.1.3", "axios": "^1.7.2", "eslint": "^8.57.0", "eslint-plugin-jest": "^28.6.0", @@ -28,5 +28,8 @@ }, "mateAcademy": { "projectType": "javascript" + }, + "dependencies": { + "nodemon": "^3.1.14" } } diff --git a/src/createServer.js b/src/createServer.js index 1cf1dda..418c903 100644 --- a/src/createServer.js +++ b/src/createServer.js @@ -1,8 +1,66 @@ +/* eslint-disable no-console */ 'use strict'; +const http = require('node:http'); +const fs = require('node:fs'); +const url = require('node:url'); +const path = require('node:path'); + function createServer() { /* Write your code here */ // Return instance of http.Server class + return http.createServer((req, res) => { + const publicDir = path.resolve(__dirname, '../public'); + const normilizedURL = new url.URL(req.url, `http://${req.headers.host}`); + const filePath = normilizedURL.pathname; + + if (req.url === '/app.js' || req.url.includes('/file/..')) { + res.statusCode = 400; + res.setHeader('Content-Type', 'text/plain'); + res.end('Bad request'); + + return; + } + + if (filePath === '/file' || !filePath.startsWith('/file/')) { + res.statusCode = 200; + res.setHeader('Content-Type', 'text/plain'); + res.end('Use /file/ to load files from public folder'); + + return; + } + + let relativePath = filePath.slice('/file/'.length); + + if (relativePath === '') { + relativePath = 'index.html'; + } + + if (relativePath.includes('//')) { + res.statusCode = 404; + res.setHeader('Content-Type', 'text/plain'); + res.end('File not found'); + + return; + } + + fs.readFile(path.join(publicDir, relativePath), (err, data) => { + if (err) { + res.statusCode = 404; + res.setHeader('Content-Type', 'text/plain'); + res.end('File not found'); + + return; + } + + const extension = path.extname(relativePath); + const contentType = extension === '.css' ? 'text/css' : 'text/html'; + + res.statusCode = 200; + res.setHeader('Content-Type', contentType); + res.end(data); + }); + }); } module.exports = {