From 68061a89dc69bc591bde85e815d274cb846c928e Mon Sep 17 00:00:00 2001 From: Oliver Etchebarne Date: Mon, 19 Feb 2024 17:08:59 -0500 Subject: [PATCH] Use $_SERVER if getallheaders() is not available --- src/Psr/ServerRequest.php | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/src/Psr/ServerRequest.php b/src/Psr/ServerRequest.php index 8fde6be..681f579 100644 --- a/src/Psr/ServerRequest.php +++ b/src/Psr/ServerRequest.php @@ -103,6 +103,12 @@ public function withoutAttribute($name): self */ public function setHeadersFromPHP(): self { + // Si no existe getallheaders(), usamos otro método para obtener las + // cabeceras + if (!function_exists('getallheaders')) { + return $this->setHeadersFromDollarServer(); + } + foreach (getallheaders() as $name => $value) { $lc_name = strtolower($name); $this->headers[$name][] = $value; @@ -120,4 +126,27 @@ public function setHeadersFromPHP(): self return $this; } + /** + * Sets the HTTP headers from $_SERVER, reverting the CGI name manipulation. + * + * Section 4.1.18 from (RFC 3875)[http://www.faqs.org/rfcs/rfc3875.html] defines + * how a client request header has to be changed. + */ + public function setHeadersFromDollarServer() + { + foreach ($_SERVER as $header => $value) { + if (str_starts_with($header, 'HTTP_')) { + // Estos son las cabeceras de la petición. Las convertimos de + // HTTP_NICE_HEADER to Nice-Header. No es obligatorio, pero se ve + $parts = explode('_', substr($header, 5)); + $name = join('-', array_map(fn($part) => ucfirst(strtolower($part)), $parts)); + + $lc_name = strtolower($name); + $this->headers[$name][] = $value; + $this->header_case_map[$lc_name] = $name; + } + } + + return $this; + } }