1. <?php
  2. /**
  3. * Extends header metadata validation with optional flags.
  4. *
  5. * @param array $headers Array of HTTP headers.
  6. * @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]).
  7. * @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]+$/']).
  8. * @return array|false Modified headers array if validation passes, false on failure.
  9. */
  10. function validateHeaders(array $headers, array $validation_rules, array $flags = []): array|false
  11. {
  12. $validated_headers = [];
  13. foreach ($validation_rules as $header_name => $rules) {
  14. if (!isset($headers[$header_name])) {
  15. if (isset($rules['required']) && $rules['required'] === true) {
  16. error_log("Header missing: " . $header_name); // Log the missing header
  17. return false; // Validation failed
  18. }
  19. continue; // Skip validation if not required and header is missing
  20. }
  21. $header_value = trim($headers[$header_name]); // Trim whitespace
  22. foreach ($rules as $rule_name => $rule_value) {
  23. switch ($rule_name) {
  24. case 'required':
  25. if ($rule_value === true && empty($header_value)) {
  26. error_log("Header '" . $header_name . "' is required but empty.");
  27. return false;
  28. }
  29. break;
  30. case 'type':
  31. switch ($rule_value) {
  32. case 'string':
  33. if (!is_string($header_value)) {
  34. error_log("Header '" . $header_name . "' must be a string.");
  35. return false;
  36. }
  37. break;
  38. case 'integer':
  39. if (!is_int($header_value)) {
  40. error_log("Header '" . $header_name . "' must be an integer.");
  41. return false;
  42. }
  43. break;
  44. case 'boolean':
  45. if ($header_value !== 'true' && $header_value !== 'false') {
  46. error_log("Header '" . $header_name . "' must be a boolean (true/false).");
  47. return false;
  48. }
  49. break;
  50. default:
  51. error_log("Unsupported type: " . $rule_value);
  52. return false;
  53. }
  54. break;
  55. case 'min_length':
  56. if (strlen($header_value) < $rule_value) {
  57. error_log("Header '" . $header_name . "' must be at least " . $rule_value . " characters long.");
  58. return false;
  59. }
  60. break;
  61. case 'max_length':
  62. if (strlen($header_value) > $rule_value) {
  63. error_log("Header '" . $header_name . "' must be at most " . $rule_value . " characters long.");
  64. return false;
  65. }
  66. break;
  67. case 'regex':
  68. if (!preg_match($rule_value, $header_value)) {
  69. error_log("Header '" . $header_name . "' does not match regex: " . $rule_value);
  70. return false;
  71. }
  72. break;
  73. case 'allow_empty':
  74. if ($rule_value === false && empty($header_value)) {
  75. error_log("Header '" . $header_name . "' must not be empty.");
  76. return false;
  77. }
  78. break;
  79. default:
  80. error_log("Unknown validation rule: " . $rule_name);
  81. return false;
  82. }
  83. }
  84. $validated_headers[$header_name] = $header_value;
  85. }
  86. return $validated_headers;
  87. }
  88. ?>

Add your comment