Pergunta

Eu estou looping através de cada linha de uma série de CURL voltou http cabeçalhos, tentando detectar quando termina um e começa outro. Eu sei que um com uma linha vazia http cabeçalho termina, mas o personagem é usado para representar este quebra de linha em php? Eu tentei com \n mas não parece trabalho. Eu certamente poderia estar fazendo algo errado.

O personagem é usado para representar a quebra de linha usado para terminar um cabeçalho?

Aqui está o meu código existente:

$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;

Resolvidos - Acontece que \r é o que eu deveria ter sido correspondente no. Muito estranho. Não sei se isso muda por site, ou se é algo set na onda. Até agora, a sua \r em todos os sites que eu tentei.

Editar 2 : Doh. Eu acho que é porque a fim de obter o cabeçalho em uma matriz de linhas, eu explodi-lo em \n. Então, talvez nenhum \r\n agora são apenas \r ...

$c = explode("\n",$content);
Foi útil?

Solução

Você precisa verificar também para "\ r \ n" e "\ r", como aqueles que também são de terminação válido linhas vazias.

Quando estiver em forma canônica, subtipos de mídia do "texto" CRLF tipo de uso como a quebra de linha de texto. HTTP relaxa esta exigência e permite o transporte dos suportes de texto com CR simples ou LF sozinho representando uma quebra de linha quando é feito de forma consistente para toda uma entidade-corpo. aplicações HTTP deve aceitar CRLF, nua CR, e LF nu como sendo representante de uma quebra de linha no media de texto recebidas via HTTP.

- HTTP / 1.1: Protocolo Parâmetros - 3.7. 1 Canonicalization e padrões de texto

Outras dicas

Os cabeçalhos terminar com uma quebra de linha dupla com nenhum espaço entre elas (isto é, uma linha de vazio). Uma quebra de linha pode ser "\ n", "\ r \ n" ou apenas "\ r". Mesmo que o último é incomum que ainda precisa ser explicada.

Talvez você possa encontrar o final dos cabeçalhos com uma expressão regular como

list($headers) = preg_split('/(\r\n?|\n)(\r\n?|\n)/', $httpresponse);
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top