From 10780426a7b64ac037a113ff402dc6ec4e62d3f2 Mon Sep 17 00:00:00 2001 From: Anton Kryzhanivskyi Date: Thu, 9 Oct 2025 18:41:00 +0300 Subject: [PATCH 1/5] add solution --- src/createServer.js | 100 +++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 98 insertions(+), 2 deletions(-) diff --git a/src/createServer.js b/src/createServer.js index 1cf1dda..4cef236 100644 --- a/src/createServer.js +++ b/src/createServer.js @@ -1,8 +1,104 @@ 'use strict'; +const http = require('http'); +const fs = require('fs'); +const zlib = require('zlib'); +const formidable = require('formidable'); + function createServer() { - /* Write your code here */ - // Return instance of http.Server class + return http.createServer((req, res) => { + if (req.url === '/' && req.method === 'GET') { + res.writeHead(200, { 'Content-Type': 'text/html' }); + + res.end(` +
+ + + +
+ `); + } else if (req.url === '/compress' && req.method === 'POST') { + const form = new formidable.IncomingForm(); + + form.parse(req, (error, fields, files) => { + if (error) { + res.statusCode = 400; + + return res.end('Error parsing form'); + } + + const compressionType = (fields.compressionType?.[0] || '') + .trim() + .toLowerCase(); + + const supported = ['gzip', 'deflate', 'br']; + + if (!supported.includes(compressionType)) { + res.statusCode = 400; + + return res.end('Unsupported compresion type'); + } + + const fileData = files.file?.[0]; + + if (!fileData) { + res.statusCode = 400; + + return res.end('Error parsing file'); + } + + const uploadedFilePath = files.file?.[0].filepath; + const originalName = files.file?.[0]?.originalFilename; + const originalNameSafe = originalName || 'file'; + + if (!uploadedFilePath) { + res.statusCode = 400; + + return res.end('File path not found'); + } + + let compressStream; + + switch (compressionType) { + case 'gzip': + compressStream = zlib.createGzip(); + break; + case 'deflate': + compressStream = zlib.createDeflate(); + break; + case 'br': + compressStream = zlib.createBrotliCompress(); + break; + } + + const ext = compressionType; + + res.writeHead(200, { + 'Content-Type': 'application/octet-stream', + 'Content-Disposition': `attachment; filename=${originalNameSafe}.${ext}`, + }); + + fs.createReadStream(uploadedFilePath).pipe(compressStream).pipe(res); + }); + } else if (req.url === '/compress') { + if (req.method !== 'POST') { + res.statusCode = 400; + + return res.end('GET not allowed on /compress'); + } + res.statusCode = 404; + + return res.end('Not Found'); + } else { + res.statusCode = 404; + + return res.end('Not FOound'); + } + }); } module.exports = { From af3f222b513c8eda7e98d21f4577612d0e6c60aa Mon Sep 17 00:00:00 2001 From: Anton Kryzhanivskyi Date: Thu, 9 Oct 2025 19:22:40 +0300 Subject: [PATCH 2/5] bug fix --- src/createServer.js | 31 +++++++++++++++++++++---------- 1 file changed, 21 insertions(+), 10 deletions(-) diff --git a/src/createServer.js b/src/createServer.js index 4cef236..0975368 100644 --- a/src/createServer.js +++ b/src/createServer.js @@ -31,19 +31,17 @@ function createServer() { return res.end('Error parsing form'); } - const compressionType = (fields.compressionType?.[0] || '') - .trim() - .toLowerCase(); + const compressionType = String(fields.compressionType || ''); const supported = ['gzip', 'deflate', 'br']; if (!supported.includes(compressionType)) { res.statusCode = 400; - return res.end('Unsupported compresion type'); + return res.end('Unsupported compression type'); } - const fileData = files.file?.[0]; + const fileData = files.file; if (!fileData) { res.statusCode = 400; @@ -51,8 +49,8 @@ function createServer() { return res.end('Error parsing file'); } - const uploadedFilePath = files.file?.[0].filepath; - const originalName = files.file?.[0]?.originalFilename; + const uploadedFilePath = files.file.filepath; + const originalName = files.file.originalFilename; const originalNameSafe = originalName || 'file'; if (!uploadedFilePath) { @@ -75,14 +73,27 @@ function createServer() { break; } - const ext = compressionType; + const extMap = { gzip: 'gz', deflate: 'dfl', br: 'br' }; + const ext = extMap[compressionType]; res.writeHead(200, { 'Content-Type': 'application/octet-stream', 'Content-Disposition': `attachment; filename=${originalNameSafe}.${ext}`, }); - fs.createReadStream(uploadedFilePath).pipe(compressStream).pipe(res); + const readStream = fs.createReadStream(uploadedFilePath); + + readStream.on('error', () => { + res.statusCode = 500; + res.end('Error reading file'); + }); + + compressStream.on('error', () => { + res.statusCode = 500; + res.end('Error compressing file'); + }); + + readStream.pipe(compressStream).pipe(res); }); } else if (req.url === '/compress') { if (req.method !== 'POST') { @@ -96,7 +107,7 @@ function createServer() { } else { res.statusCode = 404; - return res.end('Not FOound'); + return res.end('Not Foound'); } }); } From 9b97f1a3a557ef47713d5364c737e1950d943ff8 Mon Sep 17 00:00:00 2001 From: Anton Kryzhanivskyi Date: Thu, 9 Oct 2025 19:51:35 +0300 Subject: [PATCH 3/5] bug fix --- src/createServer.js | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/src/createServer.js b/src/createServer.js index 0975368..a910723 100644 --- a/src/createServer.js +++ b/src/createServer.js @@ -31,7 +31,9 @@ function createServer() { return res.end('Error parsing form'); } - const compressionType = String(fields.compressionType || ''); + const compressionType = (fields.compressionType?.[0] || '') + .trim() + .toLowerCase(); const supported = ['gzip', 'deflate', 'br']; @@ -41,7 +43,7 @@ function createServer() { return res.end('Unsupported compression type'); } - const fileData = files.file; + const fileData = files.file?.[0]; if (!fileData) { res.statusCode = 400; @@ -49,9 +51,10 @@ function createServer() { return res.end('Error parsing file'); } - const uploadedFilePath = files.file.filepath; - const originalName = files.file.originalFilename; - const originalNameSafe = originalName || 'file'; + const uploadedFile = files.file?.[0]; + const uploadedFilePath = uploadedFile?.filepath; + + const originalNameSafe = uploadedFile.originalFilename || 'file'; if (!uploadedFilePath) { res.statusCode = 400; @@ -73,14 +76,6 @@ function createServer() { break; } - const extMap = { gzip: 'gz', deflate: 'dfl', br: 'br' }; - const ext = extMap[compressionType]; - - res.writeHead(200, { - 'Content-Type': 'application/octet-stream', - 'Content-Disposition': `attachment; filename=${originalNameSafe}.${ext}`, - }); - const readStream = fs.createReadStream(uploadedFilePath); readStream.on('error', () => { @@ -93,6 +88,11 @@ function createServer() { res.end('Error compressing file'); }); + res.writeHead(200, { + 'Content-Type': 'application/octet-stream', + 'Content-Disposition': `attachment; filename=${originalNameSafe}.${compressionType}`, + }); + readStream.pipe(compressStream).pipe(res); }); } else if (req.url === '/compress') { From 0b5c5e3872f6478267a8fbe2f3e17f3daa2e4642 Mon Sep 17 00:00:00 2001 From: Anton Kryzhanivskyi Date: Thu, 9 Oct 2025 20:17:12 +0300 Subject: [PATCH 4/5] bug fix --- src/createServer.js | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/src/createServer.js b/src/createServer.js index a910723..2adb1a1 100644 --- a/src/createServer.js +++ b/src/createServer.js @@ -31,7 +31,7 @@ function createServer() { return res.end('Error parsing form'); } - const compressionType = (fields.compressionType?.[0] || '') + const compressionType = String(fields.compressionType || '') .trim() .toLowerCase(); @@ -74,6 +74,9 @@ function createServer() { case 'br': compressStream = zlib.createBrotliCompress(); break; + default: + compressStream = zlib.createGzip(); + break; } const readStream = fs.createReadStream(uploadedFilePath); @@ -96,18 +99,13 @@ function createServer() { readStream.pipe(compressStream).pipe(res); }); } else if (req.url === '/compress') { - if (req.method !== 'POST') { - res.statusCode = 400; - - return res.end('GET not allowed on /compress'); - } - res.statusCode = 404; + res.statusCode = 400; - return res.end('Not Found'); + return res.end('Only POST allowed on /compress'); } else { res.statusCode = 404; - return res.end('Not Foound'); + return res.end('Not Found'); } }); } From c86a596aa23da17721a520a1df76d2bb8abf1b01 Mon Sep 17 00:00:00 2001 From: Anton Kryzhanivskyi Date: Thu, 9 Oct 2025 20:31:29 +0300 Subject: [PATCH 5/5] bug fix --- src/createServer.js | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/createServer.js b/src/createServer.js index 2adb1a1..66794d7 100644 --- a/src/createServer.js +++ b/src/createServer.js @@ -74,9 +74,6 @@ function createServer() { case 'br': compressStream = zlib.createBrotliCompress(); break; - default: - compressStream = zlib.createGzip(); - break; } const readStream = fs.createReadStream(uploadedFilePath);