WP_Http_Cookie destrói o valor do cookie através de urldecode ()

4

Plano de fundo : trabalhando em um widget que usa uma API remota usando wp_remote_post para fazer login no serviço, uma vez conectado armazena os cookies recebidos pela segunda solicitação para consultar dados com wp_remote_get .

Problema : Os cookies da primeira requisição são armazenados na resposta como objetos WP_Http_Cookie e seus valores são executados através de urldecode como visto em class-http.php . Um dos cookies tem um valor original de l0xl4+7abTT2St+1UVA , graças ao urldecode esse valor se torna l0xl4 7abTT2St 1UVA no objeto WP_Http_Cookie e, portanto, não é o mesmo. Isso torna o objeto de cookie inutilizável, assim como o segundo pedido.

Solução alternativa : criei uma pequena solução desagradável para esse problema:

// Replace space with + from cookie value
// because WP_Http_Cookie does urldecode( value )
$response['cookies'][0]->value = str_replace(' ', '+', $response['cookies'][0]->value);

// Set cookies for the second request
$this->cookies = $response['cookies'];

Pergunta : Alguém sabe por que há um urldecode em vez de um filtro no WP_Http_Cookie? Devo registrar um problema do trac?

    
por Silvan Hagen 18.10.2012 / 04:07

2 respostas

1

A URL do AFAIK que codifica o valor do cookie ainda é uma espécie de padrão, é um antigo relict baseado no antigo e feio Netscape As especificações do cookie , que basicamente dizem que ponto e vírgula, vírgulas e espaços em branco não são permitidos, e devem ser codificados, por exemplo, usando codificação de URL. Ele também não requer clareza, nem força o uso ou codificação de URL, mas foi assim que foi implementado.

Portanto, ao passar uma string para o construtor, WP_Http_Cookie assume que os dados são de um cookie e, portanto, o valor do cookie é codificado e precisa ser decodificado. Pessoalmente eu acho que não deveria fazer isso, e deixar para o desenvolvedor manipular valores conforme necessário, como mencionado em Ticket 19922 .

No entanto, ao despachar um pedido, WP_Http_Cookie::getHeaderValue é invocado e é aqui que um filtro está disponível , wp_http_cookie_value . Supondo que o valor do cookie que você está recebendo é URL codificado, você pode recodificá-lo usando esse filtro.

function wp_http_cookie_value_filter($value, $name)
{
    return urlencode($value);
}
add_filter('wp_http_cookie_value', 'wp_http_cookie_value_filter', 10, 2);

No entanto, é claro que isso é aplicável a todas as solicitações, desde que você não saiba ao certo se é o único que usa esse filtro e / ou faz solicitações com cookies, provavelmente é uma péssima ideia.

Talvez, se seu cookie tiver um nome muito exclusivo, você possa usá-lo para filtrar apenas seus valores de cookies específicos:

function wp_http_cookie_value_filter($value, $name)
{
    if($name === 'my_very_special_cookie')
    {
        return urlencode($value);
    }
    return $value;
}
add_filter('wp_http_cookie_value', 'wp_http_cookie_value_filter', 10, 2);

Diferente de você provavelmente é melhor usar sua solução alternativa, ou seja, manipular o valor do cookie apenas para suas solicitações específicas.

    
por ndm 18.10.2012 / 12:50
0

Praticamente todas as implementações de cookies são codificadas por URL. Se você está enviando um cookie bruto, sem codificação, então você precisa controlar ambas as extremidades do pipeline. Já que você não faz, codifique seus cookies.

    
por Otto 18.10.2012 / 16:08