Wp_http_Cookie通过urldecode()销毁cookie值

时间:2012-10-18 作者:Silvan Hagen

Background: 使用wp_remote_post 要登录到该服务,请在登录后存储为第二个查询数据请求接收的Cookiewp_remote_get.

Problem: 来自第一个请求的Cookie作为WP\\u Http\\u Cookie对象存储在响应中,并通过urldecode 如中所示class-http.php. 其中一个cookie的原始值为l0xl4+7abTT2St+1UVA 感谢urldecode 此值变为l0xl4 7abTT2St 1UVA 在WP\\u Http\\u Cookie对象中,因此不相同。这使得cookie对象与第二个请求一样不可用。

Workaround: 我为这个问题想出了一个棘手的解决办法:

// 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\'];
Question: 有人知道为什么会有urldecode 而不是WP\\U Http\\U Cookie中的过滤器?我应该提交trac问题吗?

2 个回复
最合适的回答,由SO网友:ndm 整理而成

对cookie值进行编码的AFAIK URL仍然是一种事实上的标准,它是基于旧的、丑陋的Netscape cookie specs, 这基本上是说分号、逗号和空格是不允许的,应该进行编码,例如使用URL编码。它既不需要enocding,也不强制使用或URL编码,但这就是它的实现方式。

因此,当将字符串传递给构造函数时,WP_Http_Cookie 假设数据来自cookie,因此cookie值已编码并需要解码。我个人认为它不应该这样做,而是让开发人员根据需要处理值,如中所述Ticket 19922.

但是,在调度请求时,WP_Http_Cookie::getHeaderValue 调用,这是a filter is available, wp_http_cookie_value. 假设您接收的cookie值是URL编码的,您可以使用此筛选器对其重新编码。

function wp_http_cookie_value_filter($value, $name)
{
    return urlencode($value);
}
add_filter(\'wp_http_cookie_value\', \'wp_http_cookie_value_filter\', 10, 2);
然而,这当然适用于所有请求,所以只要您不能确定您是唯一使用此过滤器和/或发出包含cookie的请求的人,这可能是一个非常糟糕的主意。

如果您的cookie有一个非常独特的名称,您可以使用该名称仅过滤特定的cookie值:

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);
除此之外,您最好使用变通方法,即仅为您的特定请求操纵cookie值。

SO网友:Otto

实际上,Cookie的所有实现都是URL编码的。如果要发送未经编码的原始cookie,则需要控制管道的两端。既然你没有,就对你的cookie进行URL编码。

结束

相关推荐

How deactivate the http-api

为它提供一个tipp或解决方案来停用WP\\U Http\\U Streams类中的方法request()?我也在脱机服务器上使用WordPress,并让wp\\U debug true用于开发和测试。但是我从函数中得到了很多关于使用http类的警告;例如,在仪表板中读取提要的函数。目前我已经停用了更新主题、插件、核心和cron的所有挂钩;请参阅我的小插件:https://github.com/bueltge/WP-Offline谢谢你的回复