statuscode rule

This commit is contained in:
whaffman 2025-11-11 19:06:34 +01:00
parent 443e5c3c3b
commit bb55ffa75d
3 changed files with 53 additions and 0 deletions

View File

@ -1,3 +1,5 @@
#include "webserv/config/validation/directive_rules/StatusCodeRule.hpp"
#include <webserv/config/validation/ConfigValidator.hpp>
#include <webserv/config/validation/ValidationEngine.hpp> // for ValidationEngine
#include <webserv/config/validation/directive_rules/AValidationRule.hpp> // for AValidationRule
@ -31,6 +33,7 @@ ConfigValidator::ConfigValidator(const GlobalConfig *config) : engine_(std::make
engine_->addStructuralRule(std::make_unique<SingleDefaultServerPerPortRule>());
/*Global Directive Rules*/
engine_->addServerRule("error_page", std::make_unique<StatusCodeRule>(false));
/*Server Directive Rules*/
engine_->addServerRule("listen", std::make_unique<PortValidationRule>());
@ -41,6 +44,7 @@ ConfigValidator::ConfigValidator(const GlobalConfig *config) : engine_(std::make
/*Location Directive Rules*/
engine_->addLocationRule("allowed_methods", std::make_unique<AllowedValuesRule>(
std::vector<std::string>{"GET", "POST", "DELETE", "PUT"}, false));
engine_->addLocationRule("error_page", std::make_unique<StatusCodeRule>(false));
// Folder existence validation disabled - paths are relative to server runtime directory
// engine_->addLocationRule("root", std::make_unique<FolderExistsRule>(true));
engine_->addLocationRule("cgi_handler", std::make_unique<CgiExtValidationRule>(false));

View File

@ -0,0 +1,35 @@
#include <webserv/config/validation/directive_rules/StatusCodeRule.hpp>
#include <webserv/config/AConfig.hpp> // for AConfig
#include <webserv/config/directive/ADirective.hpp> // for ADirective
#include <webserv/config/directive/DirectiveValue.hpp> // for DirectiveValue
#include <webserv/config/validation/ValidationResult.hpp> // for ValidationResult
#include <webserv/config/validation/directive_rules/AValidationRule.hpp> // for AValidationRule
#include <webserv/utils/FileUtils.hpp> // for isFile
#include <string>
#include <utility>
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<std::pair<int, std::string>>())
{
return ValidationResult::error("Directive '" + directive->getName() + "' does not hold a int-string pair value");
}
auto value = directive->getValue().get<std::pair<int, std::string>>();
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();
}

View File

@ -0,0 +1,14 @@
#pragma once
#include <webserv/config/validation/ValidationResult.hpp> // for ValidationResult
#include <webserv/config/validation/directive_rules/AValidationRule.hpp> // for AValidationRule
#include <string> // for string
class StatusCodeRule : public AValidationRule
{
public:
StatusCodeRule(bool requiresValue);
ValidationResult validateValue(const AConfig *config, const std::string &directiveName) const override;
};