<?php
/**
* Extends header metadata validation with optional flags.
*
* @param array $headers Array of HTTP headers.
* @param array $validation_rules Associative array of validation rules. Key is header name, value is an array of rules (e.g., ['required' => true, 'type' => 'string', 'min_length' => 5]).
* @param array $flags Optional array of flags to apply to specific headers. Key is header name, value is an array of flags (e.g., ['allow_empty' => true, 'regex' => '/^[a-zA-Z0-9]+$/']).
* @return array|false Modified headers array if validation passes, false on failure.
*/
function validateHeaders(array $headers, array $validation_rules, array $flags = []): array|false
{
$validated_headers = [];
foreach ($validation_rules as $header_name => $rules) {
if (!isset($headers[$header_name])) {
if (isset($rules['required']) && $rules['required'] === true) {
error_log("Header missing: " . $header_name); // Log the missing header
return false; // Validation failed
}
continue; // Skip validation if not required and header is missing
}
$header_value = trim($headers[$header_name]); // Trim whitespace
foreach ($rules as $rule_name => $rule_value) {
switch ($rule_name) {
case 'required':
if ($rule_value === true && empty($header_value)) {
error_log("Header '" . $header_name . "' is required but empty.");
return false;
}
break;
case 'type':
switch ($rule_value) {
case 'string':
if (!is_string($header_value)) {
error_log("Header '" . $header_name . "' must be a string.");
return false;
}
break;
case 'integer':
if (!is_int($header_value)) {
error_log("Header '" . $header_name . "' must be an integer.");
return false;
}
break;
case 'boolean':
if ($header_value !== 'true' && $header_value !== 'false') {
error_log("Header '" . $header_name . "' must be a boolean (true/false).");
return false;
}
break;
default:
error_log("Unsupported type: " . $rule_value);
return false;
}
break;
case 'min_length':
if (strlen($header_value) < $rule_value) {
error_log("Header '" . $header_name . "' must be at least " . $rule_value . " characters long.");
return false;
}
break;
case 'max_length':
if (strlen($header_value) > $rule_value) {
error_log("Header '" . $header_name . "' must be at most " . $rule_value . " characters long.");
return false;
}
break;
case 'regex':
if (!preg_match($rule_value, $header_value)) {
error_log("Header '" . $header_name . "' does not match regex: " . $rule_value);
return false;
}
break;
case 'allow_empty':
if ($rule_value === false && empty($header_value)) {
error_log("Header '" . $header_name . "' must not be empty.");
return false;
}
break;
default:
error_log("Unknown validation rule: " . $rule_name);
return false;
}
}
$validated_headers[$header_name] = $header_value;
}
return $validated_headers;
}
?>
Add your comment