From 309ba08e344c938cfa1dcf7a95441999a0581141 Mon Sep 17 00:00:00 2001 From: Dora Date: Tue, 1 Jul 2025 19:05:20 +0200 Subject: [PATCH 1/2] Breaking it off from File Hosting --- README.md | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index 3c15a7e..f31c31e 100644 --- a/README.md +++ b/README.md @@ -1,14 +1,6 @@ -# TNC File Hosting +# Web Base for C++ -The Night Club's very own basic image hosting web frontend. - -# Coing Guidelines - -- In most of my projects I have less header(h/hpp) files than implementation files(c/cpp). This is very much intentional. I implement parts of a header file for ease of reading. You are expected to NOT make 1 header per 1 implementation file!!! - -- When doing ``#include`` if the same include is used more than once in different implementation files that share a header file. Move the ``#include`` to the header file instead of having two of the same includes. - -- Codebase must adhere to DRY and KISS (DRY KISS) principles! +A good starting point for web development on C++. Do implement security stuff. # Building From 14394f1c9f304064bb0ad5b7a2cc7f388c50ffec Mon Sep 17 00:00:00 2001 From: cat Date: Wed, 2 Jul 2025 15:14:16 +0300 Subject: [PATCH 2/2] Start of the body processing --- src/HTTP.cpp | 82 +++++++++++++++++++++++++++++++++++++------------ src/Helpers.cpp | 10 ++++++ src/Helpers.hpp | 3 +- src/main.hpp | 3 +- 4 files changed, 76 insertions(+), 22 deletions(-) diff --git a/src/HTTP.cpp b/src/HTTP.cpp index 69c0a93..d3a542f 100644 --- a/src/HTTP.cpp +++ b/src/HTTP.cpp @@ -1,6 +1,13 @@ #include "Helpers.hpp" #include "main.hpp" +#include +#include #include +#include +#include +#include +#include +#include void HTTPrequest::start() { // Possible Logging here @@ -15,44 +22,79 @@ void HTTPrequest::readData() { // TODO: Read until headers, headers contains the file size then allocate that // much memory on buffer, and THEN start reading the file - sock.async_read_some( - buffer.prepare(2048), + + // HEADER read + asio::async_read_until( + sock, buffer, "\r\n\r\n", // its not the other way bud [this, self](std::error_code error, std::size_t packageSize) { if (!error) { buffer.commit(packageSize); - std::istream stream(&buffer); std::unordered_map request; + std::unordered_map args; + std::istream stream(&buffer); + uint64_t bitCount = 0; // This is HTTP main request std::string rq, key, value, type, path; - std::getline(stream, type, ' '); // HTTP request type - std::getline(stream, path, ' '); // HTTP path - std::getline(stream, rq); // Removes HTTP version part no need rn - // Rest of the request vals - while (buffer.size() > 0) { - std::getline(stream, key, ':'); - std::getline(stream, rq, ' '); // trim start - // some gangster shit right here - std::getline(stream, value); + Helpers::getlineAndCount(stream, bitCount, type, + ' '); // HTTP request type + Helpers::getlineAndCount(stream, bitCount, path, ' '); // HTTP path + Helpers::getlineAndCount(stream, bitCount, + rq); // Version, omitting for now - if (type == "GET") { + // Quick stop to process arguments + std::stringstream pathStream(path); + std::getline(pathStream, path, '?'); // Keeping the path pure - request.insert({key, value}); - } else { - std::cout << key << " " << value << "\n"; - } + while (!pathStream.eof()) { + std::getline(pathStream, key, '='); + std::getline(pathStream, value, '&'); + args.insert({key, value}); + std::cout << key << " " << value << std::endl; } - processRequest(type, path, request); // This writes data too - sock.close(); // Responded + // Rest of the request vals + while (bitCount < + packageSize - 2) { // -2 is due to last two \r\n\r\n combo + Helpers::getlineAndCount(stream, bitCount, key, ':'); + Helpers::getlineAndCount( + stream, bitCount, rq, + ' '); // trim start some gangster shit right here + Helpers::getlineAndCount(stream, bitCount, value); + request.insert({key, value}); + } + + // =================== + // BODY OF THE REQUEST + // =================== + std::size_t uploadSize = + std::stoull(request.at("Content-Length")) - buffer.size(); + asio::async_read( + sock, buffer.prepare(uploadSize), + asio::transfer_exactly(uploadSize), + [self, this](std::error_code error, std::size_t packageSize) { + buffer.commit(packageSize); + std::istream bodyStream(&buffer); + std::string body; + body.resize(buffer.size()); + bodyStream.read(body.data(), buffer.size()); + + std::cout << body << "\ntest" << std::endl; + buffer.consume(buffer.size()); + sock.close(); + }); + + processRequest(type, path, request, args); // This writes data too + sock.close(); } }); } void HTTPrequest::processRequest( std::string requestType, std::string requestPath, - std::unordered_map request) { + std::unordered_map request, + std::unordered_map args) { // // This is where we will process requests // diff --git a/src/Helpers.cpp b/src/Helpers.cpp index 71b9c04..90db964 100644 --- a/src/Helpers.cpp +++ b/src/Helpers.cpp @@ -12,6 +12,16 @@ std::string Helpers::ReadFile(std::string Path) { return contents.str(); } +void Helpers::getlineAndCount(std::basic_istream &stream, uint64_t &count, + std::string &string, char delimit) { + if (delimit == '\0') { + std::getline(stream, string); + } else { + std::getline(stream, string, delimit); + } + count += string.size() + 1; // Delimiter + return; +} std::string Helpers::GenerateResponse(std::string statusCode, std::string contentType, std::string content) { diff --git a/src/Helpers.hpp b/src/Helpers.hpp index bf5d91a..f1a44cf 100644 --- a/src/Helpers.hpp +++ b/src/Helpers.hpp @@ -7,7 +7,8 @@ namespace Helpers { std::string ReadFile(std::string Path); - +void getlineAndCount(std::basic_istream &stream, uint64_t &count, + std::string &string, char delimit = '\0'); std::string GenerateResponse(std::string statusCode, std::string contentType, std::string content); // =========== diff --git a/src/main.hpp b/src/main.hpp index 5925f63..fcfdece 100644 --- a/src/main.hpp +++ b/src/main.hpp @@ -32,7 +32,8 @@ private: HTTPrequest(asio::io_context &context); void readData(); void processRequest(std::string requestType, std::string requestPath, - std::unordered_map request); + std::unordered_map request, + std::unordered_map args); void writeData(std::string data); asio::ip::tcp::socket sock;