Я прокручиваю каждую строку серии CURL, возвращая заголовки http, пытаясь обнаружить, когда кто-то кончается, и начинается следующее. Я знаю, что заголовок http заканчивается пустой строкой, но какой символ используется для представления этого разрыва строки в php? Я пробовал с \n
но он не работает. Я, конечно, мог бы сделать что-то неправильно.
Какой символ используется для представления разрыва строки, используемого для завершения заголовка?
Вот мой существующий код:
$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;
Решенный – Оказывается, что это то, на чем я должен был быть. Очень странно. Не уверен, что это изменится на сайт, или если это что-то заданное в curl. Пока что он на всех сайтах, которые я пробовал.
Редактировать 2 : Doh. Я думаю, это потому, что для того, чтобы получить заголовок в массив строк, я взорвал его на \n
. Таким образом, возможно, что все \r\n
теперь просто …
$c = explode("\n",$content);
Вам также нужно проверить «\ r \ n» и «\ r», так как они также являются допустимыми пустыми строками.
Когда в канонической форме подтипы мультимедиа типа «текст» используют CRLF в качестве разрыва текстовой строки. HTTP релаксирует это требование и позволяет переносить текстовые носители с простым CR или LF, представляющим собой разрыв строки, когда он выполняется последовательно для всего тела объекта. HTTP-приложения ДОЛЖНЫ принимать CRLF, bare CR и bare LF как представляющие разрыв строки в текстовых носителях, полученных по HTTP.
– HTTP / 1.1: Параметры протокола – 3.7.1 Канонизация и текстовые настройки по умолчанию
Заголовки заканчиваются двойным разрывом строки без пробела между ними (т.е. пустая строка). Разрыв строки может быть либо «\ n», «\ r \ n», либо просто «\ r». Несмотря на то, что последний необычен, его все еще нужно учитывать.
Возможно, вы можете найти конец заголовков с регулярным выражением
list($headers) = preg_split('/(\r\n?|\n)(\r\n?|\n)/', $httpresponse);