headers are now always lower case

This commit is contained in:
Jorijn van der Graaf 2025-11-02 16:04:32 +01:00
commit 64739c39d8
2 changed files with 50 additions and 47 deletions

View file

@ -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 { HTTPResponse ClientHTTP::Send(const char* request, std::uint32_t length) const {
client.Send(request, length); client.Send(request, length);
std::vector<char> buffer = client.RecieveSync(1024); std::vector<char> buffer;
HTTPResponse response; HTTPResponse response;
std::uint32_t i = 0; std::uint32_t i = 0;
std::uint32_t statusStart = 0; std::uint32_t statusStart = 0;
for(; i < 1024; i++) { while(true) {
if(buffer[i] == ' ') { buffer = client.RecieveSync();
statusStart = i; for(; i < buffer.size(); i++) {
break; if(buffer[i] == ' ') {
} statusStart = i;
} break;
for(; i < 1024; i++) { }
if(buffer[i] == '\r') { }
response.status.assign(buffer.data()+statusStart+1, i-statusStart-1); for(; i < buffer.size(); i++) {
break; 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; i+=2;
std::string headerName; while(i < buffer.size()) {
for(; i < 1024; i++) { std::uint32_t headerStart = i;
if(buffer[i] == ':') { std::string headerName;
headerName.assign(buffer.data()+headerStart, i-headerStart); for(; i < buffer.size(); i++) {
i+=2; if(buffer[i] == ':') {
break; headerName.assign(buffer.data()+headerStart, i-headerStart);
} std::transform(headerName.begin(), headerName.end(), headerName.begin(), [](unsigned char c){ return std::tolower(c); });
} i+=2;
headerStart = i; break;
std::string headerValue; }
for(; i < 1024; i++) { }
if(buffer[i] == '\r' && buffer[i+1] == '\n') { headerStart = i;
headerValue.assign(buffer.data()+headerStart, i-headerStart); std::string headerValue;
response.headers.insert({headerName, headerValue}); for(; i < buffer.size(); i++) {
if(buffer[i+2] == '\r'){ if(buffer[i] == '\r' && buffer[i+1] == '\n') {
goto headersComplete; headerValue.assign(buffer.data()+headerStart, i-headerStart);
} else{ response.headers.insert({headerName, headerValue});
i+=2; if(buffer[i+2] == '\r'){
break; goto headersComplete;
} } else{
} i+=2;
} break;
} }
}
}
}
i = 0;
}
headersComplete:; headersComplete:;
i+=4; i+=4;
std::unordered_map<std::string, std::string>::iterator it = response.headers.find("Content-Length"); std::unordered_map<std::string, std::string>::iterator it = response.headers.find("content-length");
if(it != response.headers.end()) if(it != response.headers.end())
{ {
const int lenght = std::stoi(it->second); const int lenght = std::stoi(it->second);
@ -109,7 +115,7 @@ HTTPResponse ClientHTTP::Send(const char* request, std::uint32_t length) const {
} }
} }
} else { } else {
std::unordered_map<std::string, std::string>::iterator it = response.headers.find("Transfer-Encoding"); std::unordered_map<std::string, std::string>::iterator it = response.headers.find("transfer-encoding");
if(it != response.headers.end() && it->second == "chunked") { if(it != response.headers.end() && it->second == "chunked") {
while(i < buffer.size()){ while(i < buffer.size()){
std::string lenght; std::string lenght;
@ -121,7 +127,6 @@ HTTPResponse ClientHTTP::Send(const char* request, std::uint32_t length) const {
} }
} }
i+=2; i+=2;
std::cout << lenght << "bro" << std::endl;
int lenghtInt = stoi(lenght, 0, 8); int lenghtInt = stoi(lenght, 0, 8);
if(lenghtInt != 0){ if(lenghtInt != 0){
int oldSize = response.body.size(); int oldSize = response.body.size();
@ -138,7 +143,6 @@ HTTPResponse ClientHTTP::Send(const char* request, std::uint32_t length) const {
goto bodyFinished; goto bodyFinished;
} }
} }
std::cout << response.body << std::endl;
while(true) { while(true) {
std::vector<char> bodyBuffer = client.RecieveSync(); std::vector<char> bodyBuffer = client.RecieveSync();
int i2 = 0; int i2 = 0;
@ -153,7 +157,6 @@ HTTPResponse ClientHTTP::Send(const char* request, std::uint32_t length) const {
} }
i2+=2; i2+=2;
int lenghtInt = stoi(lenght, 0, 8); int lenghtInt = stoi(lenght, 0, 8);
std::cout <<lenghtInt << std::endl;
if(lenghtInt != 0){ if(lenghtInt != 0){
int oldSize = response.body.size(); int oldSize = response.body.size();
response.body.resize(oldSize+lenghtInt, 0); response.body.resize(oldSize+lenghtInt, 0);

View file

@ -62,7 +62,7 @@ namespace Crafter {
return std::format("{} {} HTTP/1.1\r\nConnection: keep-alive\r\nAccept-Encoding: identity\r\nContent-Length: 0\r\nHost: {}\r\n\r\n", method, route, host); return std::format("{} {} HTTP/1.1\r\nConnection: keep-alive\r\nAccept-Encoding: identity\r\nContent-Length: 0\r\nHost: {}\r\n\r\n", method, route, host);
} }
export constexpr std::string CreateRequestHTTP(std::string method, std::string route, std::unordered_map<std::string, std::string> headers, std::string host) { export constexpr std::string CreateRequestHTTP(std::string method, std::string route, std::string host, std::unordered_map<std::string, std::string> headers) {
std::string headersString; std::string headersString;
for (auto const& [key, val] : headers) { for (auto const& [key, val] : headers) {
headersString+=std::format("{}: {}\r\n", key, val); headersString+=std::format("{}: {}\r\n", key, val);