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.

Articoli correlati