@@ -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