From 03653b78c9c77dd6c8aa7919d2d680bdb3910a10 Mon Sep 17 00:00:00 2001 From: Tymur Date: Sat, 30 May 2026 16:05:37 +0300 Subject: [PATCH] add task solution --- src/createServer.js | 103 +++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 101 insertions(+), 2 deletions(-) diff --git a/src/createServer.js b/src/createServer.js index 1cf1dda..658fb72 100644 --- a/src/createServer.js +++ b/src/createServer.js @@ -1,8 +1,107 @@ 'use strict'; +const { formidable } = require('formidable'); +const { createReadStream } = require('fs'); +const http = require('http'); +const zlib = require('node:zlib'); +const { pipeline } = require('stream'); + function createServer() { - /* Write your code here */ - // Return instance of http.Server class + const server = http.createServer(async (req, res) => { + if (req.method === 'GET' && req.url === '/') { + const htmlForm = + // eslint-disable-next-line max-len + '
'; + + res.writeHead(200, { + 'Content-Type': 'text/html', + }); + res.end(htmlForm); + + return; + } + + if (req.method === 'GET' && req.url === '/compress') { + res.statusCode = 400; + res.end(); + + return; + } + + if (req.method === 'POST' && req.url === '/compress') { + const form = formidable(); + let fields; + let files; + + try { + [fields, files] = await form.parse(req); + } catch (err) { + res.writeHead(err.httpCode || 400, { 'Content-Type': '' }); + res.end(String(err)); + + return; + } + + const compressionType = fields.compressionType?.[0]; + const uploadedFile = files.file?.[0]; + let ext; + + if (!compressionType || !uploadedFile) { + res.statusCode = 400; + res.end(); + + return; + } + + let compressor; + + switch (compressionType) { + case 'gzip': + ext = '.gz'; + compressor = zlib.createGzip(); + break; + + case 'deflate': + ext = '.dfl'; + compressor = zlib.createDeflate(); + break; + + case 'br': + ext = '.br'; + compressor = zlib.createBrotliCompress(); + break; + + default: + res.statusCode = 400; + res.end(); + + return; + } + + res.writeHead(200, { + 'Content-Type': 'application/octet-stream', + 'Content-Disposition': `attachment; filename=${uploadedFile.originalFilename}${ext}`, + }); + + pipeline( + createReadStream(uploadedFile.filepath), + compressor, + res, + (err) => { + if (err) { + res.destroy(err); + } + }, + ); + + return; + } + + res.statusCode = 404; + res.end(); + }); + + return server; } module.exports = {