Разрывы строк в заголовках PHP и HTTP: какой символ используется для представления? - PullRequest
1 голос
/ 21 апреля 2009

Я перебираю каждую строку из серии возвращаемых http заголовков CURL, пытаясь определить, когда один заканчивается, а начинается следующий. Я знаю, что заголовок 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;

Решено - Оказывается, что \r - это то, что я должен был соответствовать. Очень странно. Не уверен, что это изменится для каждого сайта, или если это что-то установлено в curl. Пока что \r на всех сайтах, которые я пробовал.

Редактировать 2 : Дох. Я думаю, это потому, что для того, чтобы поместить заголовок в массив строк, я взорвал его на \n. Так что, возможно, любой \r\n теперь просто \r ...

$c = explode("\n",$content);

Ответы [ 2 ]

3 голосов
/ 21 апреля 2009

Вам также необходимо проверить «\ r \ n» и «\ r», так как они также являются действительными завершающими пустыми строками.

В канонической форме медиа-подтипы типа «текст» используют CRLF в качестве разрыва текстовой строки. HTTP ослабляет это требование и позволяет транспортировать текстовые мультимедийные данные с одним простым CR или LF, представляющим разрыв строки, когда это делается последовательно для всего тела объекта. Приложения HTTP ДОЛЖНЫ принимать CRLF, чистый CR и чистый LF как репрезентативные для разрыва строки в текстовом медиа, полученном через HTTP.

- HTTP / 1.1: Параметры протокола - 3.7.1 Канонизация и текстовые настройки по умолчанию

2 голосов
/ 21 апреля 2009

Заголовки заканчиваются двойным переводом строки без пробела между ними (т. Е. Пустой строкой). Разрыв строки может быть либо "\ n", "\ r \ n", либо просто "\ r". Несмотря на то, что последнее необычно, его все же необходимо учитывать.

Возможно, вы могли бы найти конец заголовков с помощью регулярного выражения типа

list($headers) = preg_split('/(\r\n?|\n)(\r\n?|\n)/', $httpresponse);
...