diff --git a/webserv/handler/FileHandler.cpp b/webserv/handler/FileHandler.cpp index de9c958..d6f6512 100644 --- a/webserv/handler/FileHandler.cpp +++ b/webserv/handler/FileHandler.cpp @@ -3,7 +3,7 @@ #include // for ErrorHandler #include #include // for MIMETypes -#include // for URIParser +#include // for URI #include // for NOT_FOUND, FORBIDDEN, OK #include // for HttpResponse #include // for Log, LOCATION @@ -14,7 +14,7 @@ #include // for basic_string, string, operator+, char_traits #include // for vector -FileHandler::FileHandler(const AConfig *config, const URIParser &uriParser) : config_(config), uriParser_(uriParser) +FileHandler::FileHandler(const AConfig *config, const URI &URI) : config_(config), uri_(URI) { Log::trace(LOCATION); } @@ -67,7 +67,7 @@ std::unique_ptr FileHandler::handleDirectory(const std::string &di std::unique_ptr FileHandler::getResponse() const { Log::trace(LOCATION); - std::string filepath = uriParser_.getFullPath(); + std::string filepath = uri_.getFullPath(); ResourceType resourceType = getResourceType(filepath); switch (resourceType) @@ -85,11 +85,11 @@ FileHandler::ResourceType FileHandler::getResourceType(const std::string &path) static_cast(path); Log::trace(LOCATION); - if (uriParser_.isFile()) + if (uri_.isFile()) { return FILE; } - if (uriParser_.isDirectory()) + if (uri_.isDirectory()) { if (config_->get>("index").has_value()) { diff --git a/webserv/handler/FileHandler.hpp b/webserv/handler/FileHandler.hpp index 1b03b61..3f3a333 100644 --- a/webserv/handler/FileHandler.hpp +++ b/webserv/handler/FileHandler.hpp @@ -3,7 +3,7 @@ #include "webserv/config/AConfig.hpp" #include -#include +#include #include // for HttpResponse #include // for uint8_t @@ -11,18 +11,18 @@ #include // for string class AConfig; -class URIParser; +class URI; class FileHandler { public: - FileHandler(const AConfig *config, const URIParser &uriParser); + FileHandler(const AConfig *config, const URI &uri); [[nodiscard]] std::unique_ptr getResponse() const; private: const AConfig *config_; - const URIParser &uriParser_; + const URI &uri_; enum ResourceType : uint8_t { diff --git a/webserv/handler/URIParser.cpp b/webserv/handler/URI.cpp similarity index 74% rename from webserv/handler/URIParser.cpp rename to webserv/handler/URI.cpp index 7e207a3..37aa947 100644 --- a/webserv/handler/URIParser.cpp +++ b/webserv/handler/URI.cpp @@ -4,21 +4,26 @@ #include // for LocationConfig #include // for ServerConfig -#include +#include #include // for optional #include // for size_t #include // for stat, S_ISDIR, S_ISREG -URIParser::URIParser(const std::string &uri, const ServerConfig &serverConfig) - : uriTrimmed_(utils::trim(uri, "/")), config_(matchConfig(uriTrimmed_, serverConfig)) +URI::URI(const HttpRequest &request, const ServerConfig &serverConfig) + : uriTrimmed_(utils::trim(request.getTarget(), "/")), config_(matchConfig(uriTrimmed_, serverConfig)) { - parseUri(uri); + parseUri(request.getTarget()); parseFullpath(); + + authority_ = request.getHeaders().getHost().value(); + authority_ += (serverConfig.get("listen") != 80) // NOFORMAT + ? ":" + std::to_string(serverConfig.get("listen").value()) + : ""; } -const AConfig *URIParser::matchConfig(const std::string &uri, const ServerConfig &serverConfig) +const AConfig *URI::matchConfig(const std::string &uri, const ServerConfig &serverConfig) { const auto &locations = serverConfig.getLocationPaths(); const AConfig *bestMatch = &serverConfig; @@ -42,7 +47,7 @@ const AConfig *URIParser::matchConfig(const std::string &uri, const ServerConfig return bestMatch; } -void URIParser::parseUri(const std::string &uri) +void URI::parseUri(const std::string &uri) { if (config_->getType() == "server") { @@ -71,7 +76,7 @@ void URIParser::parseUri(const std::string &uri) } } -void URIParser::parseFullpath() +void URI::parseFullpath() { auto uriSegments = utils::split(fullPath_, '/'); @@ -99,57 +104,57 @@ void URIParser::parseFullpath() fullPath_ = FileUtils::joinPath(dir_, baseName_); } -const AConfig *URIParser::getConfig() const +const AConfig *URI::getConfig() const { return config_; } -bool URIParser::isFile() const +bool URI::isFile() const { return !baseName_.empty(); } -bool URIParser::isDirectory() const +bool URI::isDirectory() const { return baseName_.empty(); } -bool URIParser::isValid() const +bool URI::isValid() const { return FileUtils::isValidPath(fullPath_); } -const std::string &URIParser::getBaseName() const +const std::string &URI::getBaseName() const { return baseName_; } -std::string URIParser::getExtension() const +std::string URI::getExtension() const { return FileUtils::getExtension(baseName_); } -const std::string &URIParser::getFullPath() const +const std::string &URI::getFullPath() const { return fullPath_; } -const std::string &URIParser::getDir() const +const std::string &URI::getDir() const { return dir_; } -const std::string &URIParser::getPathInfo() const +const std::string &URI::getPathInfo() const { return pathInfo_; } -const std::string &URIParser::getQuery() const +const std::string &URI::getQuery() const { return query_; } -const std::string &URIParser::getFragment() const +const std::string &URI::getFragment() const { return fragment_; } \ No newline at end of file diff --git a/webserv/handler/URIParser.hpp b/webserv/handler/URI.hpp similarity index 79% rename from webserv/handler/URIParser.hpp rename to webserv/handler/URI.hpp index 16a43e8..057f125 100644 --- a/webserv/handler/URIParser.hpp +++ b/webserv/handler/URI.hpp @@ -1,6 +1,7 @@ #pragma once #include "webserv/config/AConfig.hpp" +#include "webserv/http/HttpRequest.hpp" #include #include @@ -11,14 +12,15 @@ class LocationConfig; class ServerConfig; -class URIParser +class URI { public: - URIParser(const std::string &uri, const ServerConfig &serverConfig); + URI(const HttpRequest &request, const ServerConfig &serverConfig); [[nodiscard]] bool isFile() const; [[nodiscard]] bool isDirectory() const; [[nodiscard]] bool isValid() const; + [[nodiscard]] bool isCgi() const; [[nodiscard]] std::string getExtension() const; [[nodiscard]] const AConfig *getConfig() const; @@ -28,6 +30,8 @@ class URIParser [[nodiscard]] const std::string &getPathInfo() const; [[nodiscard]] const std::string &getQuery() const; [[nodiscard]] const std::string &getFragment() const; + [[nodiscard]] const std::string &getAuthority() const; + [[nodiscard]] const std::string &getScheme() const; private: void parseUri(const std::string &uri); @@ -41,6 +45,8 @@ class URIParser std::string pathInfo_; std::string query_; std::string fragment_; + std::string authority_; + std::string scheme_; static const AConfig *matchConfig(const std::string &uri, const ServerConfig &serverConfig); }; \ No newline at end of file diff --git a/webserv/router/Router.cpp b/webserv/router/Router.cpp index 0cd715d..b32effc 100644 --- a/webserv/router/Router.cpp +++ b/webserv/router/Router.cpp @@ -5,7 +5,7 @@ #include #include // for ErrorHandler #include // for FileHandler -#include // for URIParser +#include // for URI #include // for HttpHeaders #include // for LOCATION, Log #include @@ -40,17 +40,17 @@ std::unique_ptr Router::handleRequest(const HttpRequest &request) { return ErrorHandler::getErrorResponse(400); } - URIParser uriParser{request.getTarget(), *serverConfig}; + URI uri{request, *serverConfig}; const std::string &target = request.getTarget(); static_cast(target); // Suppress unused variable warning const std::string &method = request.getMethod(); - const AConfig *config = uriParser.getConfig(); + const AConfig *config = uri.getConfig(); if (!isMethodSupported(method, *config)) { return ErrorHandler::getErrorResponse(405, config); } - FileHandler fileHandler(config, uriParser); + FileHandler fileHandler(config, uri); return fileHandler.getResponse(); } \ No newline at end of file