From 390612596242e13fd5f3460be0c1be761467bec0 Mon Sep 17 00:00:00 2001 From: Anatoliy Korotenko Date: Tue, 5 May 2026 18:06:50 +0300 Subject: [PATCH 1/2] bags --- src/createServer.js | 93 ++++++++++++++++++++++++++++++++++++++- src/index.html | 105 ++++++++++++++++++++++++++++++++++++++++++++ src/index.js | 1 + 3 files changed, 197 insertions(+), 2 deletions(-) create mode 100644 src/index.html diff --git a/src/createServer.js b/src/createServer.js index 1cf1dda..00c85ee 100644 --- a/src/createServer.js +++ b/src/createServer.js @@ -1,8 +1,97 @@ +/* eslint-disable prettier/prettier */ 'use strict'; +const http = require('http'); +const fs = require('fs'); +const path = require('path'); +const Busboy = require('busboy'); +const zlib = require('zlib'); +const { pipeline } = require('stream'); + function createServer() { - /* Write your code here */ - // Return instance of http.Server class + return http.createServer((req, res) => { + if (req.method === 'GET' && req.url === '/') { + const filePath = path.join(__dirname, 'index.html'); + + fs.readFile(filePath, (error, content) => { + if (error) { + res.statusCode = 500; + + return res.end('Server Error'); + } + res.writeHead(200, { 'Content-Type': 'text/html' }); + res.end(content); + }); + + return; + } + + if (req.method === 'GET' && req.url === '/compress') { + res.statusCode = 400; + + return res.end('Bad Request: use POST'); + } + + if (req.method === 'POST' && req.url === '/compress') { + const bb = Busboy({ headers: req.headers }); + let filename = ''; + let compressionType = ''; + const supportedTypes = { + gzip: { fn: zlib.createGzip, ext: '.gz' }, + deflate: { fn: zlib.createDeflate, ext: '.dfl' }, + br: { fn: zlib.createBrotliCompress, ext: '.br' }, + }; + + bb.on('field', (name, value) => { + if (name === 'compressionType') { + compressionType = value; + } + }); + + bb.on('file', (name, file, info) => { + filename = info.filename; + + if (name !== 'file') { + res.statusCode = 400; + + return res.end('Bad Request: invalid form field'); + } + + if (!filename) { + res.statusCode = 400; + + return res.end('Bad Request: no File'); + } + + if (!supportedTypes[compressionType]) { + res.statusCode = 400; + + return res.end('Bad Request: unsupported compression type'); + } + + const { fn, ext } = supportedTypes[compressionType]; + const compressedName = filename + ext; + + res.writeHead(200, { + 'Content-Type': 'application/octet-stream', + 'Content-Disposition': `attachment; filename="${compressedName}"`, + }); + // file.pipe(fn()).pipe(res); + + pipeline(file, fn(), res, (err) => { + if (err) { + res.statusCode = 500; + res.end('Stream error'); + } + }); + }); + req.pipe(bb); + + return; + } + res.statusCode = 404; + res.end('Not Found Data'); + }); } module.exports = { diff --git a/src/index.html b/src/index.html new file mode 100644 index 0000000..68287f5 --- /dev/null +++ b/src/index.html @@ -0,0 +1,105 @@ + + + + + + File Compressor + + + +
+

+ File Compressor +

+ +
+ +
+ + +
+ + +
+ + +
+ + +
+
+ + diff --git a/src/index.js b/src/index.js index 842ef95..90d0d63 100644 --- a/src/index.js +++ b/src/index.js @@ -1,3 +1,4 @@ +/* eslint-disable prettier/prettier */ /* eslint-disable no-console */ /* Don't change code below */ From b8297519ad0601535b39aee7d7070170e5ae1c91 Mon Sep 17 00:00:00 2001 From: Anatoliy Korotenko Date: Tue, 5 May 2026 18:15:56 +0300 Subject: [PATCH 2/2] package.json --- package.json | 5 ++++- src/createServer.js | 3 +++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index 1d03d64..9f3cce9 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", @@ -30,5 +30,8 @@ }, "mateAcademy": { "projectType": "javascript" + }, + "dependencies": { + "busboy": "^1.6.0" } } diff --git a/src/createServer.js b/src/createServer.js index 00c85ee..2b9f0d2 100644 --- a/src/createServer.js +++ b/src/createServer.js @@ -78,6 +78,9 @@ function createServer() { }); // file.pipe(fn()).pipe(res); + console.log(`file`, file); + console.log('compressionType', compressionType); + pipeline(file, fn(), res, (err) => { if (err) { res.statusCode = 500;