php / php/php-src

file_get_contents should probably clear the global state of last headers

Ouverte
#19,727 20 commentaires 0 réactions 0 personnes assignées Voir sur GitHub

Personne n'a encore pris cette issue.

Bug Category: Streams Feature
Langage dominant
C
Étoiles
40.4k
Forks
8.1k
Merge moyen
2 j 13 h
PR mergées (30 j)
96

Description

Description

The following code:

<?php

file_get_contents(__FILE__);
var_dump(http_get_last_response_headers());

file_get_contents('https://php.net/');
var_dump(http_get_last_response_headers());

file_get_contents(__FILE__);
var_dump(http_get_last_response_headers());

Resulted in this output:

NULL
array( headers from php.net )
array( headers from php.net )

But I expected this output instead:

NULL
array( headers from php.net )
NULL // as reading a file clearly outputs no headers

IMO this is very surprising, and can lead to bugs (see https://github.com/jsonrainbow/json-schema/pull/843 for example) as people are now nudged to switch to http_get_last_response_headers() by the deprecations.

The problem is that $http_response_headers, while a very ugly API, was a local variable.. and http_get_last_response_headers() while appearing cleaner stores global state and can thus leak data across boundaries if you do not call http_clear_last_response_headers() after fetching the headers.

Thus my suggestion would be that file_get_contents first clears the headers and then populates them if the stream wrapper in use has anything to populate.

/cc @Girgias as I know you were involved in the deprecation. And apologies if this was already discussed somewhere I didn't find.

PHP Version
All versions where `http_get_last_response_headers()` is available
Operating System

No response

Guide de contribution

Ouvrir le guide de contribution

Par où commencer

  1. Lisez l'issue en entier, puis le guide de contribution du projet.
  2. Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
  3. Forkez le dépôt et travaillez sur une branche.
  4. Ouvrez une pull request qui référence le numéro de l'issue.

Piste de recherche

Commence par exécuter la reproduction PHP de l’issue et lire les implémentations de file_get_contents(), http_get_last_response_headers() et http_clear_last_response_headers(). Suis la manière dont les wrappers de flux mettent à jour les en-têtes stockés, puis ajoute une couverture montrant que la lecture d’un fichier local efface les en-têtes laissés par une requête HTTP précédente ; le travail est terminé lorsque le dernier appel renvoie NULL.

Rédigé par le modèle d'indexation à partir du texte de l'issue.

Évaluation

Stack technique
c, php
Domaine
backend-api-design
Type d'issue
Bug
Difficulté
4/5
Temps estimé
3-5 jours
Activité
Calme
Clarté
Plutôt claire
Accessibilité débutants
48/100

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.