Разрывы строк заголовков PHP и HTTP:Какой символ использовался для обозначения?

StackOverflow https://stackoverflow.com/questions/771077

  •  12-09-2019
  •  | 
  •  

Вопрос

Я перебираю каждую строку серии 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);
Это было полезно?

Решение

Вам также нужно проверить наличие " " и " ", так как они также допустимы, завершая пустые строки.

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

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

Другие советы

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

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

list($headers) = preg_split('/(\r\n?|\n)(\r\n?|\n)/', $httpresponse);
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top