Intestazioni PHP cURL tramite proxy: CONNECT rispetto alle risposte di destinazione
Mantieni distinte le intestazioni CONNECT, di autenticazione, di reindirizzamento e della risposta finale quando un trasferimento PHP cURL usa un proxy.
Raccogli le righe di intestazione separatamente dal corpo della risposta. Un trasferimento tramite proxy può consegnare intestazioni CONNECT, di autenticazione, di reindirizzamento e di risposta di destinazione in un'unica operazione:
$headerLines = [];
curl_setopt($handle, CURLOPT_HEADERFUNCTION,
function ($handle, $line) use (&$headerLines) {
$headerLines[] = $line;
return strlen($line);
}
);
Questo callback conserva la sequenza grezza delle righe e restituisce il numero di byte accettati. Riceve righe complete; ma non le raggruppa ancora in risposte né seleziona le intestazioni del sito finale.
Interpretare la sequenza come blocchi
Una riga di stato HTTP apre un blocco di risposta e una riga vuota ne termina le intestazioni. Conserva questi confini prima di scegliere la risposta di destinazione finale. I tentativi di autenticazione intermedi e i reindirizzamenti possono ciascuno aggiungere blocchi.
I trailer possono arrivare più tardi tramite il callback. Mantieni sufficiente stato del parser per distinguerli dalle intestazioni iniziali, invece di collegare ogni campo successivo alla prima risposta.
Conservare o sopprimere la prova del tunnel
Leggi CURLINFO_HTTP_CONNECTCODE separatamente per lo stato CONNECT del tunnel HTTPS. Un tunnel accettato non dimostra una risposta riuscita del sito.
Se il raccoglitore non ha bisogno delle intestazioni CONNECT, CURLOPT_SUPPRESS_CONNECT_HEADERS controlla la loro consegna all'output delle intestazioni configurato e ai percorsi di callback. Verifica il supporto nella libcurl e nella build PHP collegate. Sopprimerle semplifica la raccolta ma rimuove la prova del tunnel a livello di intestazione che può aiutare la diagnosi.
Non recuperare il corpo con un offset fisso né cercando un tag HTML. Le dimensioni delle intestazioni variano, le risposte intermedie differiscono e il corpo può essere binario o vuoto. Un vecchio rapporto di bug specifico di una versione non giustifica un offset ipotizzato.
Mantieni separata la gestione del corpo e conserva l'errore di trasferimento insieme alle fasi di risposta osservate se la raccolta o l'analisi fallisce. Ciò distingue un callback interrotto, dati applicativi malformati e uno scambio proxy rifiutato.