Skip to content

Commit 6e3f23c

Browse files
committed
Allow access control headers to be overwritten by middleware
1 parent 77c5d91 commit 6e3f23c

1 file changed

Lines changed: 79 additions & 8 deletions

File tree

src/core/headers/header.php

Lines changed: 79 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -299,9 +299,11 @@ public function setHeaders($CORS = false)
299299
'bytes',
300300
));
301301

302-
$this->setHeader('Access-Control-Allow-Credentials', array(
303-
'true',
304-
));
302+
if (is_null($this->getHeaderValue('Access-Control-Allow-Credentials'))) {
303+
$this->setHeader('Access-Control-Allow-Credentials', array(
304+
'true',
305+
));
306+
}
305307

306308
if (!array_key_exists('Access-Control-Allow-Methods', $auth_headers)) {
307309
$this->setHeader('Access-Control-Allow-Methods', array(
@@ -350,11 +352,13 @@ public function setHeaders($CORS = false)
350352
$this->setAccessControllAllowedHeaders($this->getOptions()['aditionalCORSHeaders']);
351353
}
352354

353-
$origin = ($auth_headers['Origin']) ?? false;
354-
$origin = ($origin) ? $auth_headers['Origin'] : '*';
355-
$this->setHeader('Access-Control-Allow-Origin', array(
356-
$origin,
357-
));
355+
if (!$this->hasHeader('Access-Control-Allow-Origin')) {
356+
$origin = ($auth_headers['Origin']) ?? false;
357+
$origin = ($origin) ? $auth_headers['Origin'] : '*';
358+
$this->setHeader('Access-Control-Allow-Origin', array(
359+
$origin,
360+
));
361+
}
358362

359363
$this->setHeader('Access-Control-Allow-Headers', array(
360364
'origin,x-requested-with,Authorization,cache-control,content-type,x-header-csrf,x-auth-token'
@@ -492,4 +496,71 @@ private function getAccessControllAllowedHeaders(): string
492496

493497
return ',' . implode(',', $this->additionalCORSHeaders);
494498
}
499+
500+
/**
501+
* Check if a specific header is present
502+
*
503+
* @param string $propertyName
504+
* @param string $delimiter
505+
* @return bool
506+
*/
507+
public function hasHeader($propertyName, $delimiter = '_'): bool
508+
{
509+
return !is_null($this->getHeaderValue($propertyName, $delimiter));
510+
}
511+
512+
/**
513+
* Try get the header value
514+
*
515+
* @param string $propertyName
516+
* @return string|null
517+
*/
518+
public function getHeaderValue(string $propertyName, $delimiter = '_'): ?string
519+
{
520+
$allHeaders = $this->getHeaders();
521+
522+
$found = null;
523+
$headersClone = array_change_key_case($allHeaders, CASE_LOWER);
524+
foreach ($this->normalize($propertyName, $delimiter) as $i => $property) {
525+
if (array_key_exists($property, $headersClone)) {
526+
$found = $headersClone[$property];
527+
break;
528+
}
529+
}
530+
return $found;
531+
}
532+
533+
/**
534+
* Normalize the property name in 6 formats
535+
*
536+
* @param string $propertyName
537+
* @param string $delimiter
538+
* @return array
539+
*/
540+
private function normalize(string $propertyName, string $delimiter)
541+
{
542+
$nameParts = explode($delimiter, $propertyName);
543+
$camelCased = implode($delimiter, array_map(function ($el) {
544+
return ucfirst($el);
545+
}, $nameParts));
546+
547+
$outcome = [
548+
$camelCased,
549+
strtolower($propertyName),
550+
strtoupper($propertyName)
551+
];
552+
553+
if (isset($nameParts[1])) {
554+
// Safe fallback
555+
$nameParts = [
556+
ucfirst($nameParts[1]),
557+
strtolower($nameParts[1]),
558+
strtoupper($nameParts[1])
559+
];
560+
561+
$outcome = array_merge($outcome, $nameParts);
562+
}
563+
564+
return $outcome;
565+
}
495566
}

0 commit comments

Comments
 (0)