From 64739c39d8da3982e10f79147d63bb131c53f8ad Mon Sep 17 00:00:00 2001 From: Jorijn van der Graaf Date: Sun, 2 Nov 2025 16:04:32 +0100 Subject: [PATCH] headers are now always lower case --- .../Crafter.Network-ClientHTTP.cpp | 95 ++++++++++--------- interfaces/Crafter.Network-HTTP.cppm | 2 +- 2 files changed, 50 insertions(+), 47 deletions(-) diff --git a/implementations/Crafter.Network-ClientHTTP.cpp b/implementations/Crafter.Network-ClientHTTP.cpp index f23dbba..b2bbe8c 100644 --- a/implementations/Crafter.Network-ClientHTTP.cpp +++ b/implementations/Crafter.Network-ClientHTTP.cpp @@ -47,51 +47,57 @@ ClientHTTP::ClientHTTP(std::string host, std::uint16_t port): ClientHTTP(host.c_ HTTPResponse ClientHTTP::Send(const char* request, std::uint32_t length) const { client.Send(request, length); - std::vector buffer = client.RecieveSync(1024); + std::vector buffer; HTTPResponse response; - std::uint32_t i = 0; - std::uint32_t statusStart = 0; - for(; i < 1024; i++) { - if(buffer[i] == ' ') { - statusStart = i; - break; - } - } - for(; i < 1024; i++) { - if(buffer[i] == '\r') { - response.status.assign(buffer.data()+statusStart+1, i-statusStart-1); - break; - } - } - i+=2; - while(i < 1024) { - std::uint32_t headerStart = i; - std::string headerName; - for(; i < 1024; i++) { - if(buffer[i] == ':') { - headerName.assign(buffer.data()+headerStart, i-headerStart); - i+=2; - break; - } - } - headerStart = i; - std::string headerValue; - for(; i < 1024; i++) { - if(buffer[i] == '\r' && buffer[i+1] == '\n') { - headerValue.assign(buffer.data()+headerStart, i-headerStart); - response.headers.insert({headerName, headerValue}); - if(buffer[i+2] == '\r'){ - goto headersComplete; - } else{ - i+=2; - break; - } - } - } - } + std::uint32_t i = 0; + std::uint32_t statusStart = 0; + while(true) { + buffer = client.RecieveSync(); + for(; i < buffer.size(); i++) { + if(buffer[i] == ' ') { + statusStart = i; + break; + } + } + for(; i < buffer.size(); i++) { + if(buffer[i] == '\r') { + response.status.assign(buffer.data()+statusStart+1, i-statusStart-1); + break; + } + } + i+=2; + while(i < buffer.size()) { + std::uint32_t headerStart = i; + std::string headerName; + for(; i < buffer.size(); i++) { + if(buffer[i] == ':') { + headerName.assign(buffer.data()+headerStart, i-headerStart); + std::transform(headerName.begin(), headerName.end(), headerName.begin(), [](unsigned char c){ return std::tolower(c); }); + i+=2; + break; + } + } + headerStart = i; + std::string headerValue; + for(; i < buffer.size(); i++) { + if(buffer[i] == '\r' && buffer[i+1] == '\n') { + headerValue.assign(buffer.data()+headerStart, i-headerStart); + response.headers.insert({headerName, headerValue}); + if(buffer[i+2] == '\r'){ + goto headersComplete; + } else{ + i+=2; + break; + } + } + } + } + + i = 0; + } headersComplete:; i+=4; - std::unordered_map::iterator it = response.headers.find("Content-Length"); + std::unordered_map::iterator it = response.headers.find("content-length"); if(it != response.headers.end()) { const int lenght = std::stoi(it->second); @@ -109,7 +115,7 @@ HTTPResponse ClientHTTP::Send(const char* request, std::uint32_t length) const { } } } else { - std::unordered_map::iterator it = response.headers.find("Transfer-Encoding"); + std::unordered_map::iterator it = response.headers.find("transfer-encoding"); if(it != response.headers.end() && it->second == "chunked") { while(i < buffer.size()){ std::string lenght; @@ -121,7 +127,6 @@ HTTPResponse ClientHTTP::Send(const char* request, std::uint32_t length) const { } } i+=2; - std::cout << lenght << "bro" << std::endl; int lenghtInt = stoi(lenght, 0, 8); if(lenghtInt != 0){ int oldSize = response.body.size(); @@ -138,7 +143,6 @@ HTTPResponse ClientHTTP::Send(const char* request, std::uint32_t length) const { goto bodyFinished; } } - std::cout << response.body << std::endl; while(true) { std::vector bodyBuffer = client.RecieveSync(); int i2 = 0; @@ -153,7 +157,6 @@ HTTPResponse ClientHTTP::Send(const char* request, std::uint32_t length) const { } i2+=2; int lenghtInt = stoi(lenght, 0, 8); - std::cout < headers, std::string host) { + export constexpr std::string CreateRequestHTTP(std::string method, std::string route, std::string host, std::unordered_map headers) { std::string headersString; for (auto const& [key, val] : headers) { headersString+=std::format("{}: {}\r\n", key, val);