diff --git a/src/createServer.js b/src/createServer.js
index 1cf1dda..2a959c8 100644
--- a/src/createServer.js
+++ b/src/createServer.js
@@ -1,8 +1,133 @@
'use strict';
+const http = require('http');
+const zlib = require('zlib');
+const { Readable } = require('stream');
+
function createServer() {
- /* Write your code here */
- // Return instance of http.Server class
+ return http.createServer((request, response) => {
+ if (request.url === '/' && request.method === 'GET') {
+ const htmlString = `
+
+
+
+
+ Form Example
+
+
+
+
+
+ `;
+
+ response.setHeader('Content-Type', 'text/html');
+ response.statusCode = 200;
+ response.end(htmlString);
+ } else if (request.url === '/compress') {
+ if (request.method === 'GET') {
+ response.statusCode = 400;
+ response.end('Bad Request');
+
+ return;
+ }
+
+ if (request.method === 'POST') {
+ const contentType = request.headers['content-type'];
+
+ if (!contentType || !contentType.includes('boundary=')) {
+ response.statusCode = 400;
+ response.end('Bad Request');
+
+ return;
+ }
+
+ const boundary = contentType.split('boundary=')[1];
+
+ const chunks = [];
+
+ request.on('data', (chunk) => {
+ chunks.push(chunk);
+ });
+
+ request.on('end', () => {
+ const fullBuffer = Buffer.concat(chunks);
+ const fileNameMatch = fullBuffer.toString().match(/filename="(.+?)"/);
+ const compressionMatch = fullBuffer
+ .toString()
+ .match(/name="compressionType"\r\n\r\n(.+?)\r\n/);
+
+ if (!fileNameMatch || !compressionMatch) {
+ response.statusCode = 400;
+ response.end('Bad Request');
+
+ return;
+ }
+
+ const fileName = fileNameMatch[1];
+ const compressionType = compressionMatch[1];
+
+ if (!['gzip', 'deflate', 'br'].includes(compressionType)) {
+ response.statusCode = 400;
+ response.end('Invalid Compression Type');
+
+ return;
+ }
+
+ const startFileName = fullBuffer.indexOf(
+ 'filename="' + fileName + '"',
+ );
+ const fileContentStart =
+ fullBuffer.indexOf('\r\n\r\n', startFileName) + 4;
+ const fileContentEnd = fullBuffer.indexOf(
+ '\r\n--' + boundary,
+ fileContentStart,
+ );
+ const fileBuffer = fullBuffer.subarray(
+ fileContentStart,
+ fileContentEnd,
+ );
+
+ const fileStream = Readable.from(fileBuffer);
+
+ let compressedStream;
+ let extension;
+
+ if (compressionType === 'gzip') {
+ compressedStream = zlib.createGzip();
+ extension = 'gz';
+ } else if (compressionType === 'deflate') {
+ compressedStream = zlib.createDeflate();
+ extension = 'dfl';
+ } else if (compressionType === 'br') {
+ compressedStream = zlib.createBrotliCompress();
+ extension = 'br';
+ }
+
+ const newFileName = `${fileName}.${extension}`;
+
+ response.statusCode = 200;
+
+ response.setHeader(
+ 'Content-Disposition',
+ `attachment; filename=${newFileName}`,
+ );
+
+ fileStream.pipe(compressedStream).pipe(response);
+ });
+ }
+ } else {
+ response.statusCode = 404;
+ response.end('Not Found');
+ }
+ });
}
module.exports = {