Le gestionnaire cURL de Guzzle : capturer les en-têtes CONNECT du proxy
Capturez des blocs d'en-têtes de réponse distincts avec le gestionnaire cURL de Guzzle lorsque la réponse CONNECT du proxy et la réponse du site importent toutes deux.
Une requête HTTPS via un proxy HTTP peut recevoir une réponse qui accepte CONNECT, puis une réponse ultérieure du site à l'intérieur de ce tunnel. Pour la configuration initiale de la route, voir l'option proxy par requête de Guzzle. Un en-tête de la première réponse n'a pas besoin d'exister sur l'objet de réponse final.
Pour reproduire avec un point de terminaison HTTP que vous choisissez vous-même, prenez un candidat dans la liste de proxys HTTP et confirmez qu'il accepte le tunnel HTTPS. Sur le chemin du gestionnaire cURL de Guzzle 7.10, conservez chaque rappel d'en-têtes comme un bloc distinct :
$blocks = [];
$client = new \GuzzleHttp\Client([
'handler' => \GuzzleHttp\HandlerStack::create(
new \GuzzleHttp\Handler\CurlHandler()
),
]);
$response = $client->get('https://www.example.com/', [
'proxy' => 'http://proxy.example:8080',
'curl' => [CURLOPT_SUPPRESS_CONNECT_HEADERS => false],
'on_headers' => function (
\Psr\Http\Message\ResponseInterface $part
) use (&$blocks) {
$blocks[] = [
'status' => $part->getStatusCode(),
'reason' => $part->getReasonPhrase(),
'headers' => $part->getHeaders(),
];
},
]);
L'extension cURL doit exposer CURLOPT_SUPPRESS_CONNECT_HEADERS, une option introduite par libcurl 7.54.0. La définir à false permet aux en-têtes CONNECT d'atteindre le rappel d'en-têtes de cURL. Le gestionnaire de Guzzle 7.10 construit une réponse pour chaque bloc d'en-têtes terminé et appelle on_headers à cette frontière.
Gardez les blocs dans l'ordre. Les défis d'authentification, les redirections et les réponses informatives peuvent produire des blocs supplémentaires ; n'aplatissez pas toutes les valeurs dans un seul tableau et ne classez pas une réponse uniquement parce que son statut est 200.
La réponse renvoyée représente la réponse de la requête terminée, tandis que blocks conserve les observations recueillies par les rappels. Si la configuration du tunnel ou de TLS échoue, traitez l'exception de transfert levée dans l'application appelante ; une réponse finale du site peut ne pas exister.
Ce comportement est lié au gestionnaire cURL indiqué. Un gestionnaire personnalisé ou de flux n'est pas tenu d'exposer les mêmes rappels de poignée de main du proxy. Traitez les en-têtes de proxy capturés comme des données de diagnostic et évitez de conserver inutilement des valeurs liées au compte.