diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/main.cpp | 41 |
1 files changed, 29 insertions, 12 deletions
diff --git a/src/main.cpp b/src/main.cpp index bb475bd..8078ad7 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,4 +1,6 @@ #include <iostream> +#include <filesystem> +#include <fstream> #include "ClientConnection.h" #include "HttpRequest.h" @@ -7,8 +9,9 @@ int main(int argc, char** argv) { - ServerConnection server(8080); + namespace fs = std::filesystem; + ServerConnection server(8080); std::cout << "cfws v0.1.0]\n"; while (true) { @@ -16,22 +19,36 @@ int main(int argc, char** argv) ClientConnection client = server.accept_client_connection(); HttpRequest request = client.read_request(); + // Remove leading slash from the path if it exists + std::string relative_request_path = request.uri(); + while (*relative_request_path.begin() == '/') + relative_request_path.erase(0, 1); + + fs::path request_path = fs::current_path() / relative_request_path; + + // Look for an index.html if the requested path is a directory + if (fs::is_directory(request_path)) { + request_path /= "index.html"; + } + HttpResponse response; response.add_header("Server", "cfws"); - if (request.uri() == "/") { - response.set_status_code(HttpStatusCode::OK); - response.add_header("Content-Type", "text/html"); - response.set_content("<h1>Welcome to the web server!</h1><a href=\"/language\">Click here!</a>"); - } else if (request.uri() == "/language") { - if (request.header("Accept-Language").find("zh") == std::string::npos) { - response.set_status_code(HttpStatusCode::Forbidden); - response.set_content("Please set your language to Chinese to access this page."); - } else { - response.set_status_code(HttpStatusCode::OK); - response.set_content("Welcome to the page."); + + if (fs::exists(request_path)) { + std::string file_path = request_path.string(); + std::ifstream input_file(file_path); + if (!input_file.is_open()) { + std::cerr << "Failed to open file " << file_path << std::endl; } + + std::string file_contents((std::istreambuf_iterator<char>(input_file)), std::istreambuf_iterator<char>()); + + response.set_status_code(HttpStatusCode::OK); + response.add_header("Content-Type", "text/plain"); + response.set_content(file_contents); } else { response.set_status_code(HttpStatusCode::NotFound); + response.add_header("Content-Type", "text/plain"); response.set_content("Page not found!"); } |