Ce qui se passe
Les trailers HTTP sont des champs d'en-tête que le serveur envoie après le
corps de la réponse. Ils servent quand une valeur n'est connue qu'une fois tout
le corps produit : une empreinte du contenu, ou l'état final d'une opération
diffusée en flux. Le cas le plus connu est gRPC, qui rend le résultat de chaque
appel dans grpc-status et grpc-message. Jusqu'ici, le composant HttpClient de
Symfony les écartait sans rien dire.
Ce que ça change dans 8.2
Les réponses exposent une nouvelle information trailers, lue avec getInfo() :
$response = $client->request('GET', 'https://api.example.com/export');
$response->getContent(); // aller au bout du transfert
$trailers = $response->getInfo('trailers'); // null, [] ou ['x-checksum' => ['…']]- Sa valeur est
nulltant que le transfert n'est pas terminé avec succès, puis un tableau vide si le serveur n'a rien envoyé, sinon un tableau de la même forme quegetHeaders(): noms en minuscules, chacun associé à la liste de ses valeurs. - Les clients cURL, natif et Amp la gèrent.
MockResponseacceptetrailersdans son argument$info, pour les tests. - Symfony ne fusionne jamais les trailers avec les en-têtes ordinaires :
getHeaders()renvoie ce qu'il renvoyait. GuzzleHttpHandlerprend en charge l'optionon_trailersde Guzzle, qui appelle une fonction à la fin du transfert. Si le client Symfony sous-jacent n'expose pas les trailers, la requête échoue au lieu de ne jamais appeler la fonction.
Comment s'y prendre
Quand Symfony 8.2 sera disponible : lire les trailers après avoir consommé le
corps, pour parler à un service gRPC ou vérifier une empreinte, et écrire les
tests avec MockResponse.
Source : Symfony, « New in Symfony 8.2: HTTP Trailers », 22 octobre 2026. Source en anglais.