@@ -351,21 +351,28 @@ public function sendHeaders(/* ?int $statusCode = null */): static
351
351
352
352
// headers
353
353
foreach ($ this ->headers ->allPreserveCaseWithoutCookies () as $ name => $ values ) {
354
- $ previousValues = $ this ->sentHeaders [$ name ] ?? null ;
355
- if ($ previousValues === $ values ) {
356
- // Header already sent in a previous response, it will be automatically copied in this response by PHP
357
- continue ;
358
- }
354
+ $ newValues = $ values ;
355
+ $ replace = false ;
356
+
357
+ // As recommended by RFC 8297, PHP automatically copies headers from previous 103 responses, we need to deal with that if headers changed
358
+ if (103 === $ statusCode ) {
359
+ $ previousValues = $ this ->sentHeaders [$ name ] ?? null ;
360
+ if ($ previousValues === $ values ) {
361
+ // Header already sent in a previous response, it will be automatically copied in this response by PHP
362
+ continue ;
363
+ }
359
364
360
- $ replace = 0 === strcasecmp ($ name , 'Content-Type ' );
365
+ $ replace = 0 === strcasecmp ($ name , 'Content-Type ' );
366
+
367
+ if (null !== $ previousValues && array_diff ($ previousValues , $ values )) {
368
+ header_remove ($ name );
369
+ $ previousValues = null ;
370
+ }
361
371
362
- if (null !== $ previousValues && array_diff ($ previousValues , $ values )) {
363
- header_remove ($ name );
364
- $ previousValues = null ;
372
+ $ newValues = null === $ previousValues ? $ values : array_diff ($ values , $ previousValues );
365
373
}
366
374
367
- $ newValues = null === $ previousValues ? $ values : array_diff ($ values , $ previousValues );
368
- foreach ($ newValues as $ value ) {
375
+ foreach ($ newValues as $ value ) {
369
376
header ($ name .': ' .$ value , $ replace , $ this ->statusCode );
370
377
}
371
378
0 commit comments