From 02d63fde937e04c9b00036f0f1606e0ab5af8541 Mon Sep 17 00:00:00 2001 From: Voloshynd Date: Wed, 16 Jul 2025 20:22:09 +0200 Subject: [PATCH] soution of task node_compression-app --- src/createServer.js | 117 +++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 115 insertions(+), 2 deletions(-) diff --git a/src/createServer.js b/src/createServer.js index 1cf1dda..8d83ddc 100644 --- a/src/createServer.js +++ b/src/createServer.js @@ -1,8 +1,121 @@ 'use strict'; +const http = require('node:http'); +const { formidable } = require('formidable'); +const fs = require('node:fs'); +const zlib = require('node:zlib'); + function createServer() { - /* Write your code here */ - // Return instance of http.Server class + const server = new http.Server(); + + server.on('request', async (req, res) => { + if (req.url === '/') { + res.statusCode = 200; + res.setHeader('Content-Type', 'text/html'); + + res.end(` +
+
+

+ +
+

+ + +
+ `); + } else if (req.url === '/favicon.ico') { + res.end(''); + } else if (req.method === 'POST' && req.url === '/compress') { + const form = formidable({}); + + form.parse(req, (err, fields, files) => { + if (err) { + res.statusCode = 400; + + return res.end('Error while parsing the form'); + } + + const compressionType = Array.isArray(fields.compressionType) + ? fields.compressionType[0] + : fields.compressionType; + + const file = Array.isArray(files.file) ? files.file[0] : files.file; + + if (!compressionType || !file || !file.filepath) { + res.statusCode = 400; + + return res.end('File or compression type missing'); + } + + let compressor; + let extension; + + switch (compressionType) { + case 'gzip': + compressor = zlib.createGzip(); + extension = 'gzip'; + break; + case 'deflate': + compressor = zlib.createDeflate(); + extension = 'deflate'; + break; + case 'br': + compressor = zlib.createBrotliCompress(); + extension = 'br'; + break; + default: + res.statusCode = 400; + + return res.end('Unsupported compression type'); + } + + const inputPath = file.filepath; + const originalName = file.originalFilename || 'file.txt'; + + if (!fs.existsSync(inputPath)) { + res.statusCode = 400; + + return res.end('Uploaded file not found'); + } + + res.statusCode = 200; + + res.setHeader( + 'Content-Disposition', + `attachment; filename=${originalName}.${extension}`, + ); + + const readStream = fs.createReadStream(inputPath); + + readStream.pipe(compressor).pipe(res); + + res.on('close', () => { + readStream.destroy(); + compressor.destroy(); + }); + }); + } else if (req.url === '/compress' && req.method === 'GET') { + res.statusCode = 400; + res.end('GET not supported for /compress'); + } else { + res.statusCode = 404; + res.end('Not found'); + + return null; + } + }); + + server.on('error', (error) => { + // eslint-disable-next-line no-console + console.log('Error', error); + }); + + return server; } module.exports = {