From bb55ffa75d44b93aab9db806edfb5c6cf1360828 Mon Sep 17 00:00:00 2001 From: whaffman Date: Tue, 11 Nov 2025 19:06:34 +0100 Subject: [PATCH] statuscode rule --- webserv/config/validation/ConfigValidator.cpp | 4 +++ .../directive_rules/StatusCodeRule.cpp | 35 +++++++++++++++++++ .../directive_rules/StatusCodeRule.hpp | 14 ++++++++ 3 files changed, 53 insertions(+) create mode 100644 webserv/config/validation/directive_rules/StatusCodeRule.cpp create mode 100644 webserv/config/validation/directive_rules/StatusCodeRule.hpp diff --git a/webserv/config/validation/ConfigValidator.cpp b/webserv/config/validation/ConfigValidator.cpp index 36af0a2..0e18839 100644 --- a/webserv/config/validation/ConfigValidator.cpp +++ b/webserv/config/validation/ConfigValidator.cpp @@ -1,3 +1,5 @@ +#include "webserv/config/validation/directive_rules/StatusCodeRule.hpp" + #include #include // for ValidationEngine #include // for AValidationRule @@ -31,6 +33,7 @@ ConfigValidator::ConfigValidator(const GlobalConfig *config) : engine_(std::make engine_->addStructuralRule(std::make_unique()); /*Global Directive Rules*/ + engine_->addServerRule("error_page", std::make_unique(false)); /*Server Directive Rules*/ engine_->addServerRule("listen", std::make_unique()); @@ -41,6 +44,7 @@ ConfigValidator::ConfigValidator(const GlobalConfig *config) : engine_(std::make /*Location Directive Rules*/ engine_->addLocationRule("allowed_methods", std::make_unique( std::vector{"GET", "POST", "DELETE", "PUT"}, false)); + engine_->addLocationRule("error_page", std::make_unique(false)); // Folder existence validation disabled - paths are relative to server runtime directory // engine_->addLocationRule("root", std::make_unique(true)); engine_->addLocationRule("cgi_handler", std::make_unique(false)); diff --git a/webserv/config/validation/directive_rules/StatusCodeRule.cpp b/webserv/config/validation/directive_rules/StatusCodeRule.cpp new file mode 100644 index 0000000..7d6044b --- /dev/null +++ b/webserv/config/validation/directive_rules/StatusCodeRule.cpp @@ -0,0 +1,35 @@ +#include + +#include // for AConfig +#include // for ADirective +#include // for DirectiveValue +#include // for ValidationResult +#include // for AValidationRule +#include // for isFile + +#include +#include + +StatusCodeRule::StatusCodeRule(bool requiresValue) + : AValidationRule("CgiExt", "Ensure CGI extension is valid", requiresValue) +{ +} + +ValidationResult StatusCodeRule::validateValue(const AConfig *config, const std::string &directiveName) const +{ + const ADirective *directive = config->getDirective(directiveName); + if (!directive->getValue().holds>()) + { + return ValidationResult::error("Directive '" + directive->getName() + "' does not hold a int-string pair value"); + } + + auto value = directive->getValue().get>(); + int statusCode = value.first; + if (statusCode < 100 || statusCode > 599) + { + return ValidationResult::error("Directive '" + directive->getName() + "' has invalid status code: " + + std::to_string(statusCode)); + } + + return ValidationResult::success(); +} \ No newline at end of file diff --git a/webserv/config/validation/directive_rules/StatusCodeRule.hpp b/webserv/config/validation/directive_rules/StatusCodeRule.hpp new file mode 100644 index 0000000..57b92fb --- /dev/null +++ b/webserv/config/validation/directive_rules/StatusCodeRule.hpp @@ -0,0 +1,14 @@ +#pragma once + +#include // for ValidationResult +#include // for AValidationRule + +#include // for string + +class StatusCodeRule : public AValidationRule +{ + public: + StatusCodeRule(bool requiresValue); + + ValidationResult validateValue(const AConfig *config, const std::string &directiveName) const override; +}; \ No newline at end of file