PHP e HTTP riga di intestazione Breaks: Che carattere utilizzato per rappresentare?
-
12-09-2019 - |
Domanda
Sto scorrendo ogni riga di una serie di CURL restituito intestazioni HTTP, cercando di rilevare quando si finisce e inizia il successivo. So che un header http termina con una riga vuota, ma che carattere è utilizzato per rappresentare questa interruzione di linea in php? Ho provato con \n
ma non sembra funzionare. Io certamente potrei essere fare qualcosa di sbagliato.
Che personaggio è usato per rappresentare l'interruzione di riga usato per terminare un colpo di testa?
Ecco il mio codice esistente:
$redirect = '';
$regs = '';
foreach ($curl_response as $line)
{
if ($line != "\n")
{ # line is not a linebreak, so we're still processing a header block
if (preg_match("(HTTP/[0-9]\.[0-9] [0-9]{3} .*)",$line))
{ # line is the status code
# highlight the outputted line
$output .= "<b style='background: yellow;'>$line</b>";
}
elseif (preg_match("/^Location: (.*)$/m",$line,$regs))
{ # the line is a location header, so grab the location being redirected to
# highlight the outputted line
$output .= "<b style='background: purple; color: white;'>$line</b>";
$redirect = $regs[1];
}
else
{ # some other header, record to output
$output .= $line;
}
}
else
{ # we've reached a line break, so we're getting to a new block of redirects
$output .= "\nreached line break\n";
if ($redirect != '')
{ # if we recorded a redirect above, append it to output
$output .= "\n\nRedirecting to $redirect\n\n";
$redirect = '';
}
}
}
echo $output;
Risolto - Risulta che \r
è quello che avrebbe dovuto essere corrispondente su. Molto strano. Non sono sicuro se questo cambia per ogni sito, o se è qualcosa impostato in ricciolo. Finora la sua \r
su tutti i siti che ho provato.
Modifica 2 : Doh. Credo che sia perché al fine di ottenere l'intestazione in un array di linee, esplosi su \n
. Quindi, forse, qualsiasi \r\n
sono ora solo \r
...
$c = explode("\n",$content);
Soluzione
È necessario controllare anche per "\ r \ n" e "\ r", come quelli sono validi anche terminare righe vuote.
Quando in forma canonica, i sottotipi dei media del "testo" tipo uso CRLF come l'interruzione di riga di testo. HTTP rilassa questa esigenza e permette il trasporto dei supporti testo con CR normale o LF sola rappresenta un'interruzione di riga quando avviene sempre per un intero corpo dell'entità. applicazioni HTTP deve accettare CRLF, CR nuda, e LF nuda come rappresentante di un'interruzione di linea nei mezzi di testo ricevuto via HTTP.
HTTP / 1.1: Parametri di protocollo - 3.7. 1 canonica e di testo predefiniti
Altri suggerimenti
Le intestazioni terminano con un'interruzione doppia linea senza spazio tra (cioè una riga vuota). Un'interruzione di riga può essere "\ n", "\ r \ n" o semplicemente "\ r". Anche se quest'ultimo è raro che deve ancora essere rappresentato.
Forse si potrebbe trovare la fine delle intestazioni con un'espressione regolare come
list($headers) = preg_split('/(\r\n?|\n)(\r\n?|\n)/', $httpresponse);