En-têtes PHP cURL via un proxy : CONNECT face aux réponses de destination
Gardez distincts les en-têtes CONNECT, d'authentification, de redirection et de réponse finale lorsqu'un transfert PHP cURL passe par un proxy.
Collectez les lignes d'en-tête séparément du corps de la réponse. Un transfert via un proxy peut livrer des en-têtes CONNECT, d'authentification, de redirection et de réponse de destination en une seule opération :
$headerLines = [];
curl_setopt($handle, CURLOPT_HEADERFUNCTION,
function ($handle, $line) use (&$headerLines) {
$headerLines[] = $line;
return strlen($line);
}
);
Ce callback conserve la séquence brute des lignes et renvoie le nombre d'octets acceptés. Il reçoit des lignes complètes ; mais il ne les regroupe pas encore en réponses et ne sélectionne pas les en-têtes du site final.
Interpréter la séquence comme des blocs
Une ligne de statut HTTP ouvre un bloc de réponse, et une ligne vide termine ses en-têtes. Préservez ces frontières avant de choisir la réponse de destination finale. Les tentatives d'authentification intermédiaires et les redirections peuvent chacune ajouter des blocs.
Les trailers peuvent arriver plus tard via le callback. Conservez suffisamment d'état de l'analyseur pour les distinguer des en-têtes initiaux, au lieu de rattacher chaque champ ultérieur à la première réponse.
Conserver ou supprimer la trace du tunnel
Lisez CURLINFO_HTTP_CONNECTCODE séparément pour le statut CONNECT du tunnel HTTPS. Un tunnel accepté n'établit pas une réponse réussie du site.
Si le collecteur n'a pas besoin des en-têtes CONNECT, CURLOPT_SUPPRESS_CONNECT_HEADERS contrôle leur livraison vers la sortie d'en-têtes configurée et les chemins de callback. Vérifiez la prise en charge dans la libcurl et la compilation PHP liées. La suppression simplifie la collecte mais retire la trace du tunnel au niveau des en-têtes, qui peut aider au diagnostic.
Ne récupérez pas le corps avec un décalage fixe ni en cherchant une balise HTML. La taille des en-têtes varie, les réponses intermédiaires diffèrent et le corps peut être binaire ou vide. Un ancien rapport de bogue propre à une version ne justifie pas un décalage deviné.
Gardez le traitement du corps séparé et conservez l'erreur de transfert avec les étapes de réponse observées si la collecte ou l'analyse échoue. Cela distingue un callback interrompu, des données applicatives malformées et un échange de proxy rejeté.