From 481b4b410a6be2eb53eb986939c083b9771c74d1 Mon Sep 17 00:00:00 2001 From: cat Date: Mon, 7 Jul 2025 03:11:41 +0300 Subject: [PATCH] Added processFormData and reorganised the files --- CMakeLists.txt | 13 ++--- src/{ => Base}/Entry.cpp | 2 +- src/{ => Base}/Webserver.cpp | 2 +- src/{ => HTTP}/HTTP.cpp | 4 +- src/{ => HTTP}/HTTPRequestProcess.cpp | 4 +- src/HTTPMethods.cpp | 13 ++++- src/Helpers.hpp | 12 +++++ src/{ => Helpers}/Helpers.cpp | 3 +- src/Helpers/HelpersFormProcess.cpp | 70 +++++++++++++++++++++++++++ www/index.html | 6 ++- 10 files changed, 114 insertions(+), 15 deletions(-) rename src/{ => Base}/Entry.cpp (93%) rename src/{ => Base}/Webserver.cpp (97%) rename src/{ => HTTP}/HTTP.cpp (97%) rename src/{ => HTTP}/HTTPRequestProcess.cpp (98%) rename src/{ => Helpers}/Helpers.cpp (92%) create mode 100644 src/Helpers/HelpersFormProcess.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 9c22cbb..5fcd824 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -9,13 +9,14 @@ set(CMAKE_CXX_FLAGS "-Wall -g -fsanitize=address") add_executable( Webserver - "src/Entry.cpp" - "src/Webserver.cpp" - "src/HTTP.cpp" + "src/Base/Entry.cpp" + "src/Base/Webserver.cpp" + "src/HTTP/HTTP.cpp" "libs/QuickDigest5/quickdigest5.cpp" - "src/Helpers.cpp" - "src/HTTPRequestProcess.cpp" - "./src/HTTPMethods.cpp") + "src/Helpers/Helpers.cpp" + "src/HTTP/HTTPRequestProcess.cpp" + "src/HTTPMethods.cpp" + "src/Helpers/HelpersFormProcess.cpp") add_custom_command( TARGET Webserver diff --git a/src/Entry.cpp b/src/Base/Entry.cpp similarity index 93% rename from src/Entry.cpp rename to src/Base/Entry.cpp index 622edad..b2c6698 100644 --- a/src/Entry.cpp +++ b/src/Base/Entry.cpp @@ -1,4 +1,4 @@ -#include "Main.hpp" +#include "../Main.hpp" #include #include diff --git a/src/Webserver.cpp b/src/Base/Webserver.cpp similarity index 97% rename from src/Webserver.cpp rename to src/Base/Webserver.cpp index 5c1ea5e..380b75f 100644 --- a/src/Webserver.cpp +++ b/src/Base/Webserver.cpp @@ -1,4 +1,4 @@ -#include "Main.hpp" +#include "../Main.hpp" #include #include diff --git a/src/HTTP.cpp b/src/HTTP/HTTP.cpp similarity index 97% rename from src/HTTP.cpp rename to src/HTTP/HTTP.cpp index d0decd0..4c4bed5 100644 --- a/src/HTTP.cpp +++ b/src/HTTP/HTTP.cpp @@ -1,5 +1,5 @@ -#include "Helpers.hpp" -#include "Main.hpp" +#include "../Helpers.hpp" +#include "../Main.hpp" #include void HTTPrequest::start() { diff --git a/src/HTTPRequestProcess.cpp b/src/HTTP/HTTPRequestProcess.cpp similarity index 98% rename from src/HTTPRequestProcess.cpp rename to src/HTTP/HTTPRequestProcess.cpp index 2a6b8ca..67d5453 100644 --- a/src/HTTPRequestProcess.cpp +++ b/src/HTTP/HTTPRequestProcess.cpp @@ -1,5 +1,5 @@ -#include "Helpers.hpp" -#include "Main.hpp" +#include "../Helpers.hpp" +#include "../Main.hpp" #include #include #include diff --git a/src/HTTPMethods.cpp b/src/HTTPMethods.cpp index 120f42b..37a5cfc 100644 --- a/src/HTTPMethods.cpp +++ b/src/HTTPMethods.cpp @@ -1,5 +1,6 @@ #include "Helpers.hpp" #include "Main.hpp" +#include // Idea is very simple this map has it so that stuff like // responseMethods["GET","/"] have a method inside them @@ -18,6 +19,16 @@ void Webserver::initResponses() { }; responseMethods["POST"]["/upload"] = [](HTTPrequest *self) { - self->sendResponse("200 OK", "text/text", self->bodyContent); + auto result = Helpers::processFormData(self->bodyContent, + self->headers["Content-Type"]); + std::stringstream resp; + resp << "You have sent\n" + << "filePassword = " << result["filePassword"].data << "\n" + << "name = " << result["name"].data << "\n" + << "numb = " << result["numb"].data << "\n" + << "time = " << result["time"].data << "\n" + << "uploadedFile = " << result["uploadedFile"].data << " as filetype " + << result["uploadedFile"].headers["Content-Type"] << "\n"; + self->sendResponse("200 OK", "text/text", resp.str()); }; } diff --git a/src/Helpers.hpp b/src/Helpers.hpp index ba75344..b1b9c23 100644 --- a/src/Helpers.hpp +++ b/src/Helpers.hpp @@ -1,8 +1,20 @@ #include #include +#include namespace Helpers { +struct formData { + std::string data; + std::unordered_map headers; +}; + std::string ReadFile(std::string Path); void getlineAndCount(std::basic_istream &stream, uint64_t &count, std::string &string, char delimit = '\0'); +std::unordered_map +processFormData(std::string data, std::string contentType); +namespace detail_processFormData { +std::string inline getFieldName(const std::string &dataBlock); +std::string inline getBodyData(const std::string &dataBlock); +} // namespace detail_processFormData } // namespace Helpers diff --git a/src/Helpers.cpp b/src/Helpers/Helpers.cpp similarity index 92% rename from src/Helpers.cpp rename to src/Helpers/Helpers.cpp index 3f71786..e13a1a4 100644 --- a/src/Helpers.cpp +++ b/src/Helpers/Helpers.cpp @@ -1,5 +1,6 @@ -#include "Helpers.hpp" +#include "../Helpers.hpp" #include +#include #include #include diff --git a/src/Helpers/HelpersFormProcess.cpp b/src/Helpers/HelpersFormProcess.cpp new file mode 100644 index 0000000..ccbb43d --- /dev/null +++ b/src/Helpers/HelpersFormProcess.cpp @@ -0,0 +1,70 @@ +#include "../Helpers.hpp" + +// FORM PROCESSOR +std::unordered_map +Helpers::processFormData(std::string data, std::string contentType) { + std::unordered_map formDataMap; + + std::string boundary = + "--" + + contentType.substr(contentType.find('=') + + 1); // Boundary for some fucking reason misses -- + + std::size_t currentPos = 0; + std::size_t nextBoundaryPos = 0; + + while (nextBoundaryPos != std::string::npos) { + Helpers::formData fieldData; + + // Find the current data block + std::size_t blockStart = currentPos + boundary.size() + 1; // +1 due to \n + nextBoundaryPos = data.find(boundary, blockStart); + + std::size_t blockEnd = + (nextBoundaryPos != std::string::npos) + ? nextBoundaryPos + : data.size() - boundary.size() - 3; // - 3 for final "--\n" + + std::string dataBlock = data.substr(blockStart, blockEnd - blockStart); + std::string fieldName = detail_processFormData::getFieldName(dataBlock); + + // Process headers + std::size_t headersEnd = dataBlock.find("\r\n\r\n"), headerPos = 0; + while (headerPos < headersEnd) { + std::size_t colonPos = dataBlock.find(":", headerPos), + lineEnd = dataBlock.find("\r\n", colonPos); + if (colonPos == std::string::npos || lineEnd == std::string::npos) + break; + fieldData.headers.insert( + {dataBlock.substr(headerPos, colonPos - headerPos), + dataBlock.substr(colonPos + 2, + lineEnd - colonPos - 2)}); // -/+ 2's are for \r\n + headerPos = lineEnd + 2; // Same as above + } + + fieldData.data = detail_processFormData::getBodyData(dataBlock); + + formDataMap.insert({fieldName, fieldData}); + currentPos = nextBoundaryPos; + } + + return formDataMap; +} + +// =================== +// Inline Helpers +// =================== +std::string inline Helpers::detail_processFormData::getFieldName( + const std::string &dataBlock) { + size_t nameStart = dataBlock.find("name=") + 6; // Skip 'name="' + size_t nameEnd = dataBlock.find("\"", nameStart); + return dataBlock.substr(nameStart, nameEnd - nameStart); +} + +std::string inline Helpers::detail_processFormData::getBodyData( + const std::string &dataBlock) { + size_t bodyStart = dataBlock.find("\r\n\r\n") + 4; // Skip "\r\n\r\n" + size_t bodyLength = + dataBlock.size() - bodyStart - 2; // Remove trailing "\r\n" + return dataBlock.substr(bodyStart, bodyLength); +} diff --git a/www/index.html b/www/index.html index 3254160..eb322db 100644 --- a/www/index.html +++ b/www/index.html @@ -11,7 +11,11 @@

Welcome

POST test

- + + + + +