summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/ClientConnection.cpp6
-rw-r--r--src/ClientConnection.h3
-rw-r--r--src/HttpRequest.cpp24
-rw-r--r--src/HttpRequest.h12
-rw-r--r--src/main.cpp3
5 files changed, 45 insertions, 3 deletions
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 <iostream>
+
+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 <map>
+#include <string>
+
+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<std::string, std::string> 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 <iostream>
#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");