@@ -300,38 +300,41 @@ private static function ipv6InRange($ip, $start, $end)
300
300
}
301
301
302
302
303
- function filter_headers_strings ($ php_headers , $ allowed_headers , $ remove_headers ) {
304
- $ allowed_headers = $ allowed_headers ?? [];
303
+ function filter_headers_strings ($ php_headers , $ headers_requiring_opt_in , $ remove_headers ) {
304
+ $ headers_requiring_opt_in = $ headers_requiring_opt_in ?? [];
305
305
$ remove_headers = $ remove_headers ?? [];
306
306
307
307
$ allowed_request_headers_header = strtolower ('X-Cors-Proxy-Allowed-Request-Headers ' );
308
308
309
- // Add any additional allowed headers from X-Cors-Proxy-Allowed-Request-Headers
310
- if (isset ($ php_headers [$ allowed_request_headers_header ])) {
311
- $ allowed_request_headers = $ php_headers [$ allowed_request_headers_header ];
309
+ $ lowercased_php_headers = array_change_key_case ($ php_headers , CASE_LOWER );
312
310
313
- $ additional_headers = array_map (
311
+ // Get explicitly allowed headers from X-Cors-Proxy-Allowed-Request-Headers
312
+ $ explicitly_allowed_headers = [];
313
+ if (isset ($ lowercased_php_headers [$ allowed_request_headers_header ])) {
314
+ $ explicitly_allowed_headers = array_map (
314
315
'trim ' ,
315
- explode (', ' , $ allowed_request_headers )
316
+ explode (', ' , $ lowercased_php_headers [ $ allowed_request_headers_header ] )
316
317
);
317
- $ allowed_headers = array_merge ($ allowed_headers , $ additional_headers );
318
318
}
319
+ $ explicitly_allowed_headers = array_map ('strtolower ' , $ explicitly_allowed_headers );
319
320
320
- $ allowed_headers = array_map ('strtolower ' , $ allowed_headers );
321
-
322
- // Only keep headers that are in the allowed list
323
- $ php_headers = array_filter ($ php_headers , function ($ header ) use ($ allowed_headers ) {
324
- $ header_name = strtolower (explode (': ' , $ header )[0 ]);
325
- return in_array ($ header_name , $ allowed_headers );
326
- });
327
-
321
+ $ headers_requiring_opt_in = array_map ('strtolower ' , $ headers_requiring_opt_in );
328
322
$ remove_headers = array_map ('strtolower ' , $ remove_headers );
329
323
330
- // Remove strictly disallowed headers
324
+ // Filter headers
331
325
return array_filter (
332
326
$ php_headers ,
333
- function ($ key ) use ($ remove_headers ) {
334
- return !in_array (strtolower ($ key ), $ remove_headers );
327
+ function ($ key ) use ($ headers_requiring_opt_in , $ remove_headers , $ explicitly_allowed_headers ) {
328
+ $ lower_key = strtolower ($ key );
329
+ // Remove if in remove_headers list
330
+ if (in_array ($ lower_key , $ remove_headers )) {
331
+ return false ;
332
+ }
333
+ // Remove if requires opt-in but not explicitly allowed
334
+ if (in_array ($ lower_key , $ headers_requiring_opt_in ) && !in_array ($ lower_key , $ explicitly_allowed_headers )) {
335
+ return false ;
336
+ }
337
+ return true ;
335
338
},
336
339
ARRAY_FILTER_USE_KEY
337
340
);
0 commit comments