diff --git a/.clang-format b/.clang-format index 3e5f49c..4134397 100644 --- a/.clang-format +++ b/.clang-format @@ -1 +1,38 @@ -BasedOnStyle: Microsoft \ No newline at end of file +BasedOnStyle: Microsoft + +# Include ordering +SortIncludes: CaseSensitive +IncludeBlocks: Regroup +IncludeCategories: + # Main header (current file's header) + - Regex: '^".*\.hpp"$' + Priority: 1 + SortPriority: 1 + CaseSensitive: true + # Project headers + - Regex: '^$' + Priority: 2 + SortPriority: 2 + CaseSensitive: true + # System C++ headers + - Regex: '^<[a-z_]+>$' + Priority: 3 + SortPriority: 3 + CaseSensitive: true + # System C headers + - Regex: '^<.*\.h>$' + Priority: 4 + SortPriority: 4 + CaseSensitive: true + # Third-party libraries + - Regex: '^<.*>$' + Priority: 5 + SortPriority: 5 + CaseSensitive: true + +# Allow simple functions and if statements on one line +AllowShortFunctionsOnASingleLine: Inline +AllowShortIfStatementsOnASingleLine: WithoutElse +AllowShortLoopsOnASingleLine: true +AllowShortBlocksOnASingleLine: Empty +AllowShortCaseLabelsOnASingleLine: true \ No newline at end of file diff --git a/.gitignore b/.gitignore index 3ad428e..afa4e9a 100644 --- a/.gitignore +++ b/.gitignore @@ -2,7 +2,4 @@ *.a build .cache - - - webserv.log diff --git a/CMakeLists.txt b/CMakeLists.txt index bf17ce3..1317432 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -5,6 +5,13 @@ project(webserv) set(CMAKE_CXX_STANDARD 20) set(CMAKE_CXX_STANDARD_REQUIRED ON) +# Enable parallel compilation +include(ProcessorCount) +ProcessorCount(N) +if(NOT N EQUAL 0) + set(CMAKE_BUILD_PARALLEL_LEVEL ${N}) +endif() + # Add source files file(GLOB_RECURSE SOURCES "${PROJECT_SOURCE_DIR}/webserv/*.cpp" diff --git a/webserv/client/Client.cpp b/webserv/client/Client.cpp index fb82294..6d5efb9 100644 --- a/webserv/client/Client.cpp +++ b/webserv/client/Client.cpp @@ -1,8 +1,10 @@ #include "webserv/socket/Socket.hpp" -#include + #include #include +#include + Client::Client(std::unique_ptr socket, Server &server, const ServerConfig &server_config) : client_socket_(std::move(socket)), server(std::ref(server)), server_config(std::cref(server_config)) { @@ -14,7 +16,7 @@ Client::~Client() server.removeFromEpoll(*client_socket_); }; -int Client::parseHeaderforContentLength(const std::string &request) //NOLINT +int Client::parseHeaderforContentLength(const std::string &request) // NOLINT { std::string header = "Content-Length: "; size_t pos = request.find(header); diff --git a/webserv/client/Client.hpp b/webserv/client/Client.hpp index e0b1e9d..ca6fe40 100644 --- a/webserv/client/Client.hpp +++ b/webserv/client/Client.hpp @@ -1,10 +1,12 @@ #pragma once #include "webserv/socket/Socket.hpp" -#include + #include #include +#include + class Server; class Client diff --git a/webserv/config/ConfigManager.cpp b/webserv/config/ConfigManager.cpp index 0d1dc8b..f19ba36 100644 --- a/webserv/config/ConfigManager.cpp +++ b/webserv/config/ConfigManager.cpp @@ -8,13 +8,9 @@ #include #include -ConfigManager::ConfigManager() : _initialized(false) -{ -} +ConfigManager::ConfigManager() : _initialized(false) {} -ConfigManager::~ConfigManager() -{ -} +ConfigManager::~ConfigManager() {} ConfigManager &ConfigManager::getInstance() { diff --git a/webserv/config/ConfigManager.hpp b/webserv/config/ConfigManager.hpp index 948c507..fb2af78 100644 --- a/webserv/config/ConfigManager.hpp +++ b/webserv/config/ConfigManager.hpp @@ -1,10 +1,10 @@ #pragma once +#include + #include #include -#include - class ConfigManager { public: diff --git a/webserv/config/LocationConfig.cpp b/webserv/config/LocationConfig.cpp index 4567e4d..669688f 100644 --- a/webserv/config/LocationConfig.cpp +++ b/webserv/config/LocationConfig.cpp @@ -2,7 +2,6 @@ #include #include -#include #include #include diff --git a/webserv/config/LocationConfig.hpp b/webserv/config/LocationConfig.hpp index e0c1004..ac32485 100644 --- a/webserv/config/LocationConfig.hpp +++ b/webserv/config/LocationConfig.hpp @@ -1,8 +1,7 @@ #pragma once -#include #include - +#include class LocationConfig { diff --git a/webserv/config/ServerConfig.cpp b/webserv/config/ServerConfig.cpp index dee9f77..2323588 100644 --- a/webserv/config/ServerConfig.cpp +++ b/webserv/config/ServerConfig.cpp @@ -1,9 +1,9 @@ +#include "ServerConfig.hpp" + #include -#include #include #include -#include #include #include @@ -54,7 +54,7 @@ void ServerConfig::parseServerBlock(const std::string &block) void ServerConfig::parseDirectives(const std::string &declarations) { - LOG_INFO("Parsing server directives" ); + LOG_INFO("Parsing server directives"); std::string line; std::istringstream stream(declarations); while (std::getline(stream, line)) diff --git a/webserv/config/ServerConfig.hpp b/webserv/config/ServerConfig.hpp index a1cdec4..c584e5d 100644 --- a/webserv/config/ServerConfig.hpp +++ b/webserv/config/ServerConfig.hpp @@ -1,13 +1,13 @@ #pragma once +#include + #include #include #include -#include - class ServerConfig -{ +{ public: ServerConfig(const std::string &serverBlock); @@ -20,6 +20,7 @@ class ServerConfig [[nodiscard]] const std::vector &getIndexFiles() const { return index_files; } [[nodiscard]] const LocationConfig &getLocation(const std::string &path) const; [[nodiscard]] std::vector getLocationPaths() const; + void setServerFD(int fd) { server_fd = fd; } [[nodiscard]] int getServerFD() const { return server_fd; } diff --git a/webserv/log/Channel.hpp b/webserv/log/Channel.hpp index e3d8299..c9f5c36 100644 --- a/webserv/log/Channel.hpp +++ b/webserv/log/Channel.hpp @@ -1,10 +1,11 @@ #pragma once -#include -#include #include #include +#include +#include + class Channel { public: diff --git a/webserv/log/FileChannel.cpp b/webserv/log/FileChannel.cpp index 631c7b2..87ed95f 100644 --- a/webserv/log/FileChannel.cpp +++ b/webserv/log/FileChannel.cpp @@ -1,13 +1,11 @@ #include "webserv/log/LogLevel.hpp" + #include #include #include - -FileChannel::FileChannel(const std::string &filename) - : filename_(filename), - fileStream_(filename, std::ios::trunc) +FileChannel::FileChannel(const std::string &filename) : filename_(filename), fileStream_(filename, std::ios::trunc) { if (!fileStream_.is_open()) { @@ -23,8 +21,7 @@ FileChannel::~FileChannel() } } -void FileChannel::log(LogLevel &logLevel, const std::string &message, - const std::map &context) +void FileChannel::log(LogLevel &logLevel, const std::string &message, const std::map &context) { if (!fileStream_.is_open()) { @@ -39,7 +36,7 @@ void FileChannel::log(LogLevel &logLevel, const std::string &message, // Format the log message fileStream_ << "[" << std::put_time(tm, "%Y-%m-%d %H:%M:%S") << "] " - << "[" << logLevelToString(logLevel) << "] " << message << '\n'; + << "[" << logLevelToString(logLevel) << "] " << message << '\n'; // Log the context if it exists if (!context.empty()) @@ -52,4 +49,3 @@ void FileChannel::log(LogLevel &logLevel, const std::string &message, } fileStream_ << std::flush; } - diff --git a/webserv/log/FileChannel.hpp b/webserv/log/FileChannel.hpp index 63b0140..4c56a95 100644 --- a/webserv/log/FileChannel.hpp +++ b/webserv/log/FileChannel.hpp @@ -3,9 +3,9 @@ #include #include -#include #include #include +#include class FileChannel : public Channel { @@ -24,4 +24,4 @@ class FileChannel : public Channel private: std::string filename_; std::ofstream fileStream_; -}; \ No newline at end of file +}; \ No newline at end of file diff --git a/webserv/log/Log.cpp b/webserv/log/Log.cpp index a0a075e..13a15e5 100644 --- a/webserv/log/Log.cpp +++ b/webserv/log/Log.cpp @@ -1,10 +1,11 @@ -#include -#include -#include #include #include #include +#include +#include +#include + Log::Log() { // get start time @@ -52,6 +53,7 @@ void Log::log(LogLevel level, const std::string &message, const std::string &fil if (it != channels_.end()) { std::string extendedMessage; + extendedMessage += message + " | "; if (!file.empty()) { extendedMessage += std::filesystem::path(file).filename().string(); @@ -64,7 +66,7 @@ void Log::log(LogLevel level, const std::string &message, const std::string &fil { extendedMessage += " (" + function + ")"; } - extendedMessage += " | " + message; + // extendedMessage += " | " + message; it->second->log(level, extendedMessage, context); } } diff --git a/webserv/log/Log.hpp b/webserv/log/Log.hpp index e6dcaba..bb8f70c 100644 --- a/webserv/log/Log.hpp +++ b/webserv/log/Log.hpp @@ -1,12 +1,13 @@ #pragma once +#include +#include + #include #include #include #include #include -#include -#include #define LOG(level, message) Log::static_log((level), (message), __FILE__, __LINE__, __FUNCTION__, "file", {}) diff --git a/webserv/log/LogLevel.hpp b/webserv/log/LogLevel.hpp index 19d8d5a..cdf999c 100644 --- a/webserv/log/LogLevel.hpp +++ b/webserv/log/LogLevel.hpp @@ -29,18 +29,12 @@ inline std::string logLevelToString(LogLevel level) { switch (level) { - case LogLevel::LOGLVL_TRACE: - return "TRACE"; - case LogLevel::LOGLVL_DEBUG: - return "DEBUG"; - case LogLevel::LOGLVL_INFO: - return "INFO"; - case LogLevel::LOGLVL_WARN: - return "WARN"; - case LogLevel::LOGLVL_ERROR: - return "ERROR"; - case LogLevel::LOGLVL_FATAL: - return "FATAL"; + case LogLevel::LOGLVL_TRACE: return "TRACE"; + case LogLevel::LOGLVL_DEBUG: return "DEBUG"; + case LogLevel::LOGLVL_INFO: return "INFO"; + case LogLevel::LOGLVL_WARN: return "WARN"; + case LogLevel::LOGLVL_ERROR: return "ERROR"; + case LogLevel::LOGLVL_FATAL: return "FATAL"; } return "UNKNOWN"; } @@ -49,18 +43,12 @@ inline const char *logLevelToColor(LogLevel level) { switch (level) { - case LogLevel::LOGLVL_TRACE: - return LogColors::TRACE_COLOR; - case LogLevel::LOGLVL_DEBUG: - return LogColors::DEBUG_COLOR; - case LogLevel::LOGLVL_INFO: - return LogColors::INFO_COLOR; - case LogLevel::LOGLVL_WARN: - return LogColors::WARN_COLOR; - case LogLevel::LOGLVL_ERROR: - return LogColors::ERROR_COLOR; - case LogLevel::LOGLVL_FATAL: - return LogColors::FATAL_COLOR; + case LogLevel::LOGLVL_TRACE: return LogColors::TRACE_COLOR; + case LogLevel::LOGLVL_DEBUG: return LogColors::DEBUG_COLOR; + case LogLevel::LOGLVL_INFO: return LogColors::INFO_COLOR; + case LogLevel::LOGLVL_WARN: return LogColors::WARN_COLOR; + case LogLevel::LOGLVL_ERROR: return LogColors::ERROR_COLOR; + case LogLevel::LOGLVL_FATAL: return LogColors::FATAL_COLOR; } return LogColors::RESET; } diff --git a/webserv/log/StdoutChannel.cpp b/webserv/log/StdoutChannel.cpp index fb634ed..df784a4 100644 --- a/webserv/log/StdoutChannel.cpp +++ b/webserv/log/StdoutChannel.cpp @@ -1,7 +1,8 @@ +#include + +#include #include #include -#include -#include void StdoutChannel::log(LogLevel &logLevel, const std::string &message, const std::map &context) diff --git a/webserv/main.cpp b/webserv/main.cpp index a828ecd..4ffd60d 100644 --- a/webserv/main.cpp +++ b/webserv/main.cpp @@ -1,4 +1,5 @@ #include "webserv/log/Log.hpp" + #include #include #include diff --git a/webserv/server/Server.cpp b/webserv/server/Server.cpp index 0720ea1..e941e90 100644 --- a/webserv/server/Server.cpp +++ b/webserv/server/Server.cpp @@ -1,17 +1,18 @@ #include "webserv/socket/Socket.hpp" -#include // For inet_addr -#include // For exit() -#include // For memset -#include // For fcntl()" -#include + +#include +#include + +#include // For memset #include +#include + +#include // For inet_addr +#include // For fcntl() #include // For sockaddr_in #include #include // For socket functions #include // For close() -#include -#include -#include Server::Server(const ConfigManager &configManager) : epoll_fd_(epoll_create1(0)), configManager_(configManager) { @@ -207,8 +208,8 @@ void Server::eventLoop() ssize_t bytesSent = send(event.data.fd, httpResponse, strlen(httpResponse), 0); if (bytesSent < 0) { - LOG_ERROR("Send failed for fd: " + std::to_string(event.data.fd) + " with error: " + std::strerror(errno)); - + LOG_ERROR("Send failed for fd: " + std::to_string(event.data.fd) + + " with error: " + std::strerror(errno)); } else { diff --git a/webserv/server/Server.hpp b/webserv/server/Server.hpp index 9112647..91ad9e0 100644 --- a/webserv/server/Server.hpp +++ b/webserv/server/Server.hpp @@ -1,13 +1,15 @@ #pragma once #include "webserv/config/ServerConfig.hpp" -#include -#include -#include + #include #include #include +#include +#include +#include + class Client; class Server @@ -28,7 +30,7 @@ class Server void start(); void addToEpoll(const Socket &socket, uint32_t events) const; - void removeFromEpoll(const Socket &socket) const ; + void removeFromEpoll(const Socket &socket) const; void setupServerSocket(const ServerConfig &config); void handleConnection(struct epoll_event *event); void handleRequest(struct epoll_event *event) const; @@ -39,7 +41,6 @@ class Server const ServerConfig &getConfig(int fd) const; const ServerConfig &getConfig(const Socket &socket) const; - private: int epoll_fd_; const ConfigManager &configManager_; diff --git a/webserv/socket/Socket.cpp b/webserv/socket/Socket.cpp index acd04f2..baca4ac 100644 --- a/webserv/socket/Socket.cpp +++ b/webserv/socket/Socket.cpp @@ -1,14 +1,14 @@ -#include -#include #include +#include +#include #include -#include // For close() #include // For inet_addr #include // For fcntl()" #include // For sockaddr_in #include +#include // For close() Socket::Socket() : _fd(socket(AF_INET, SOCK_STREAM, 0)) { @@ -32,7 +32,7 @@ Socket::Socket(int fd) : _fd(fd) // NOLINT(readability-identifier-naming) { if (_fd == -1) { - LOG_ERROR("Invalid file descriptor"); + LOG_ERROR("Invalid file descriptor"); throw std::runtime_error("Invalid file descriptor"); } setNonBlocking(); diff --git a/webserv/socket/Socket.hpp b/webserv/socket/Socket.hpp index 3634b70..ef6e2ed 100644 --- a/webserv/socket/Socket.hpp +++ b/webserv/socket/Socket.hpp @@ -2,6 +2,7 @@ #include #include + #include class Socket @@ -10,8 +11,8 @@ class Socket Socket(); Socket(int fd); // NOLINT readability-identifier-naming - Socket(const Socket &other) = delete; // Disable copy constructor - Socket &operator=(const Socket &other) = delete; // Disable copy assignment + Socket(const Socket &other) = delete; // Disable copy constructor + Socket &operator=(const Socket &other) = delete; // Disable copy assignment Socket(Socket &&other) noexcept = default; // Move constructor Socket &operator=(Socket &&other) noexcept = default; // Move assignment