Aujourd’hui, je souhaite tester une route que j’ai créé dans mon application Symfony. J’utilise Postman. Ma requête est un POST
, avec des headers. Jusque là, rien d’anormal.
L’un des headers est composé de plusieurs mots, que je concatène donc avec des underscores. J’ai donc un header qui s’appelle mon_header
. Pareil, rien d’extraordinaire. En fait, c’est même autorisé par HTTP. Je cite le RFC 822 pour prouver.
The field-name must be composed of printable ASCII characters (i.e., characters that have values between 33. and 126., decimal, except colon)
Le underscore est donc un caractère valide. Mais Apache et Symfony en décide autrement. En premier lieu, Apache supprime silencieusement tout header contenant des underscores. C’est le cas dans la 2.4, version utilisée par ce projet.
Puis en deuxième lieu, Symfony remplace automatiquement les majuscules par des minuscules et les underscores par des tirets**. Sans aucune raison et sans possibilité d’influer sur ce comportement. C’est ce qu’on retrouve dans ce fichier.
protected const UPPER = '_ABCDEFGHIJKLMNOPQRSTUVWXYZ';
protected const LOWER = '-abcdefghijklmnopqrstuvwxyz';
public function all(string $key = null)
{
if (null !== $key) {
return $this->headers[strtr($key, self::UPPER, self::LOWER)] ?? [];
}
return $this->headers;
}
Je ne connais pas les raisons de ces comportements. Tout ce que je sais, c’est que j’ai perdu du temps ce matin pour une erreur qui n’existerait pas si certains n’étaient pas plus royalistes que le roi.