From 103dd121e48514d25ada2f52a34ba2dec69548a4 Mon Sep 17 00:00:00 2001 From: Vouchyk Date: Tue, 23 Dec 2025 15:58:50 +0000 Subject: [PATCH 1/3] Tasks solution --- src/createServer.js | 119 +++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 117 insertions(+), 2 deletions(-) diff --git a/src/createServer.js b/src/createServer.js index 1cf1dda..293f813 100644 --- a/src/createServer.js +++ b/src/createServer.js @@ -1,8 +1,123 @@ +/* eslint-disable no-console */ 'use strict'; +const http = require('http'); +const Busboy = require('busboy'); +const zlib = require('zlib'); + function createServer() { - /* Write your code here */ - // Return instance of http.Server class + const compressionTypes = { + gzip: () => zlib.createGzip(), + deflate: () => zlib.createDeflate(), + br: () => zlib.createBrotliCompress(), + }; + + return http.createServer((req, res) => { + if (req.method === 'GET' && req.url === '/') { + res.statusCode = 200; + res.setHeader('Content-Type', 'text/html'); + + res.end(` + + + + File Compression + + +

File Compression

+
+
+ + +
+ +
+ + +
+
+ +
+
+ + + `); + + return; + } + + if (req.method === 'GET' && req.url === '/compress') { + res.statusCode = 400; + res.end('Incorrect method'); + + return; + } + + if (req.method === 'POST' && req.url === '/compress') { + const busboy = Busboy({ headers: req.headers }); + const fields = {}; + let fileBuffer = null; + let fileName = null; + + busboy.on('field', (name, value) => { + fields[name] = value; + }); + + busboy.on('file', (fieldname, file, info) => { + const chunks = []; + + fileName = info.filename; + + file.on('data', (chunk) => chunks.push(chunk)); + + file.on('end', () => { + fileBuffer = Buffer.concat(chunks); + }); + }); + + busboy.on('finish', () => { + const { compressionType } = fields; + + if ( + !fileBuffer || + !compressionType || + !compressionTypes[compressionType] + ) { + res.statusCode = 400; + res.end('Form Invalid'); + + return; + } + + const compressor = compressionTypes[compressionType](); + const extensions = { gzip: '.gzip', deflate: '.deflate', br: '.br' }; + const compressedFileName = `${fileName}${extensions[compressionType]}`; + + res.statusCode = 200; + res.setHeader('Content-Type', 'application/octet-stream'); + + res.setHeader( + 'Content-Disposition', + `attachment; filename=${compressedFileName}`, + ); + + const { Readable } = require('stream'); + + Readable.from(fileBuffer).pipe(compressor).pipe(res); + }); + + req.pipe(busboy); + + return; + } + + res.statusCode = 404; + res.end('Not found'); + }); } module.exports = { From 849f7fcbc0f04be3302a85478ea18466232b27e5 Mon Sep 17 00:00:00 2001 From: Vouchyk Date: Tue, 23 Dec 2025 18:57:48 +0000 Subject: [PATCH 2/3] fix mistake --- package.json | 6 +++++- src/createServer.js | 2 +- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 1d03d64..612a995 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", @@ -26,9 +26,13 @@ "form-data": "^4.0.0", "formidable": "^3.5.1", "jest": "^29.7.0", + "nodemon": "^3.1.11", "prettier": "^3.3.2" }, "mateAcademy": { "projectType": "javascript" + }, + "dependencies": { + "busboy": "^1.6.0" } } diff --git a/src/createServer.js b/src/createServer.js index 293f813..a813395 100644 --- a/src/createServer.js +++ b/src/createServer.js @@ -94,7 +94,7 @@ function createServer() { } const compressor = compressionTypes[compressionType](); - const extensions = { gzip: '.gzip', deflate: '.deflate', br: '.br' }; + const extensions = { gzip: '.gz', deflate: '.dfl', br: '.br' }; const compressedFileName = `${fileName}${extensions[compressionType]}`; res.statusCode = 200; From c9c7337d59b123fdddea217447c4aa25a5d4583e Mon Sep 17 00:00:00 2001 From: Vouchyk Date: Tue, 23 Dec 2025 18:59:36 +0000 Subject: [PATCH 3/3] fix mistake --- src/createServer.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/createServer.js b/src/createServer.js index a813395..293f813 100644 --- a/src/createServer.js +++ b/src/createServer.js @@ -94,7 +94,7 @@ function createServer() { } const compressor = compressionTypes[compressionType](); - const extensions = { gzip: '.gz', deflate: '.dfl', br: '.br' }; + const extensions = { gzip: '.gzip', deflate: '.deflate', br: '.br' }; const compressedFileName = `${fileName}${extensions[compressionType]}`; res.statusCode = 200;