From c2cc2e5c759863229ce9d48d014243f6e7260353 Mon Sep 17 00:00:00 2001 From: cflip Date: Thu, 7 Jul 2022 13:09:11 -0600 Subject: Create an HttpRequest class --- Makefile | 1 + src/ClientConnection.cpp | 6 +++++- src/ClientConnection.h | 3 ++- src/HttpRequest.cpp | 24 ++++++++++++++++++++++++ src/HttpRequest.h | 12 ++++++++++++ src/main.cpp | 3 ++- 6 files changed, 46 insertions(+), 3 deletions(-) create mode 100644 src/HttpRequest.cpp create mode 100644 src/HttpRequest.h diff --git a/Makefile b/Makefile index 8a44899..cf63161 100644 --- a/Makefile +++ b/Makefile @@ -4,6 +4,7 @@ CFLAGS=-pedantic -Wall --std=c++11 SRC=src/main.cpp \ src/ClientConnection.cpp \ src/ServerConnection.cpp \ + src/HttpRequest.cpp \ src/HttpResponse.cpp OUT=cfws diff --git a/src/ClientConnection.cpp b/src/ClientConnection.cpp index da0cf9f..d54b4ee 100644 --- a/src/ClientConnection.cpp +++ b/src/ClientConnection.cpp @@ -9,8 +9,10 @@ ClientConnection::ClientConnection(int socket) { } -void ClientConnection::dump_request_data() +HttpRequest ClientConnection::read_request() { + // TODO: Clean up this code to ensure it works with multiple lines + // and not risk a buffer overflow. constexpr int BUFFER_SIZE = 4096; char buffer[BUFFER_SIZE+1]; int n; @@ -24,6 +26,8 @@ void ClientConnection::dump_request_data() memset(buffer, 0, BUFFER_SIZE); } + + return HttpRequest(buffer); } bool ClientConnection::send(const HttpResponse& response) diff --git a/src/ClientConnection.h b/src/ClientConnection.h index 55be620..b322c07 100644 --- a/src/ClientConnection.h +++ b/src/ClientConnection.h @@ -1,12 +1,13 @@ #pragma once +#include "HttpRequest.h" #include "HttpResponse.h" class ClientConnection { public: ClientConnection(int socket); - void dump_request_data(); + HttpRequest read_request(); bool send(const HttpResponse&); void close_connection(); diff --git a/src/HttpRequest.cpp b/src/HttpRequest.cpp new file mode 100644 index 0000000..351c971 --- /dev/null +++ b/src/HttpRequest.cpp @@ -0,0 +1,24 @@ +#include "HttpRequest.h" + +#include + +HttpRequest::HttpRequest(const std::string& request_string) +{ + size_t pos = 0; + std::string s = request_string; + std::string line; + while ((pos = s.find("\r\n")) != std::string::npos) { + line = s.substr(0, pos); + + // If the line contains a colon, we assume it's a header. + // TODO: This may not always be the case. + size_t delim_pos = 0; + if ((delim_pos = line.find(":")) != std::string::npos) { + std::string header_key = s.substr(0, delim_pos); + std::string header_value = s.substr(delim_pos + 2, s.find("\r\n") - delim_pos - 2); + m_headers[header_key] = header_value; + //std::cout << "1?: {" << header_maybe << "}, 2?: {" << value_maybe << "}\n"; + } + s.erase(0, pos + 2); + } +} diff --git a/src/HttpRequest.h b/src/HttpRequest.h new file mode 100644 index 0000000..5f3a9f5 --- /dev/null +++ b/src/HttpRequest.h @@ -0,0 +1,12 @@ +#pragma once + +#include +#include + +class HttpRequest { +public: + HttpRequest(const std::string& request_string); + std::string header(const std::string& header_key) const { return m_headers.at(header_key); }; +private: + std::map m_headers; +}; diff --git a/src/main.cpp b/src/main.cpp index 3521079..5e92815 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,6 +1,7 @@ #include #include "ClientConnection.h" +#include "HttpRequest.h" #include "HttpResponse.h" #include "ServerConnection.h" @@ -13,7 +14,7 @@ int main(int argc, char** argv) while (true) { std::cout << "Waiting for connections on port 8080" << std::endl; ClientConnection client = server.accept_client_connection(); - client.dump_request_data(); + HttpRequest request = client.read_request(); HttpResponse response(HttpStatusCode::OK); response.add_header("Server", "cfws"); -- cgit v1.2.3