Esatto ... semplicemente fai cosi, che è di solito quello che faccio io

codice:
$headerRecived = false;
$headerText = '';
while (!feof($fp))
{
$buffer = fread($fp, 8192);

if ($headerRecived == false)
{
if (($headersEnd = strpos($buffer, "\n\n")) === FALSE)
{
$headerText .= $buffer;
}
else
{
$headerText .= substr($buffer, 0, $headersEnd);

// PARSA GLI HEADERS

// INVIA GLI HEADERS NECESSARI

// Invia l'output rimanente
echo substr($buffer, $headersEnd);

// Setta lo switch
$headerRecived = true;
}
}
else
{
echo $buffer;
}
}
Per parsare gli headers semplicemente li esplodi prima sull'invio ovvero \n, dopo di che li cicli col while e rimuovi la prima riga mettendola da parte perché è lo status, dopo che li esplodi sul : e acquisisci la prima parte che ti viene restituita togliendola usando array_shift dopo di che reimplodi l'array che hai ancora senza quel primo elemento col : in modo che se c'è ne stavano altri nella stringa non si è corrotta ... un giochino stupido ma efficente