Template
1
0

Compare commits

...

2 Commits

Author SHA1 Message Date
cat
063a4f3cf9 rebase hell is over + some tweaks to README.md 2025-07-02 15:37:07 +03:00
cat
9f5abcafa1 Start of the body processing 2025-07-02 15:30:31 +03:00
5 changed files with 87 additions and 31 deletions

View File

@@ -1,15 +1,7 @@
# TNC File Hosting
# TNC File Hoster
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!
# Building
1. To build the project you must install the header-only (a.k.a not-boost version) of ASIO.
@@ -21,3 +13,13 @@ The Night Club's very own basic image hosting web frontend.
4. lastly run ``$ make``
You can run ``./Webserver`` to run the server fully.
# 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!

View File

@@ -1,6 +1,13 @@
#include "Helpers.hpp"
#include "main.hpp"
#include <asio/completion_condition.hpp>
#include <asio/impl/read_until.hpp>
#include <iostream>
#include <istream>
#include <ostream>
#include <sstream>
#include <string>
#include <system_error>
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<std::string, std::string> request;
std::unordered_map<std::string, std::string> 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
Helpers::getlineAndCount(stream, bitCount, type,
' '); // HTTP request type
Helpers::getlineAndCount(stream, bitCount, path, ' '); // HTTP path
Helpers::getlineAndCount(stream, bitCount,
rq); // Version, omitting for now
// Quick stop to process arguments
std::stringstream pathStream(path);
std::getline(pathStream, path, '?'); // Keeping the path pure
while (!pathStream.eof()) {
std::getline(pathStream, key, '=');
std::getline(pathStream, value, '&');
args.insert({key, value});
std::cout << key << " " << value << std::endl;
}
// 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);
if (type == "GET") {
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});
} else {
std::cout << key << " " << value << "\n";
}
}
processRequest(type, path, request); // This writes data too
sock.close(); // Responded
// ===================
// 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<std::string, std::string> request) {
std::unordered_map<std::string, std::string> request,
std::unordered_map<std::string, std::string> args) {
//
// This is where we will process requests
//

View File

@@ -12,6 +12,16 @@ std::string Helpers::ReadFile(std::string Path) {
return contents.str();
}
void Helpers::getlineAndCount(std::basic_istream<char> &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) {

View File

@@ -7,7 +7,8 @@
namespace Helpers {
std::string ReadFile(std::string Path);
void getlineAndCount(std::basic_istream<char> &stream, uint64_t &count,
std::string &string, char delimit = '\0');
std::string GenerateResponse(std::string statusCode, std::string contentType,
std::string content);
// ===========

View File

@@ -32,7 +32,8 @@ private:
HTTPrequest(asio::io_context &context);
void readData();
void processRequest(std::string requestType, std::string requestPath,
std::unordered_map<std::string, std::string> request);
std::unordered_map<std::string, std::string> request,
std::unordered_map<std::string, std::string> args);
void writeData(std::string data);
asio::ip::tcp::socket sock;