Http-файл cookie WP уничтожает значение файла cookie с помощью urldecode()
Предыстория: Работа над виджетом, который использует удаленный API, используя wp_remote_post
для входа в службу, после входа в систему сохраняет файлы cookie, полученные для второго запроса, для запроса данных с помощью wp_remote_get
.
Проблема: Файлы cookie из первого запроса сохраняются в ответе как объекты WP_Http_Cookie, и их значения передаются через urldecode
, как показано в class-http.php . Один из файлов cookie имеет исходное значение l0xl4+7abTT2St+1UVA
благодаря urldecode
это значение становится l0xl4 7abTT2St 1UVA
в объекте WP_Http_Cookie и, следовательно, не совпадает. Это делает объект cookie непригодным для использования, как и для второго запроса.
Обходной путь: Я придумал неприятный маленький обходной путь для этой проблемы:
// 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'];
Вопрос: Кто-нибудь знает, почему в WP_Http_Cookie вместо фильтра есть urldecode
? Должен ли я подать заявление о проблеме с трафиком?
2 answers
Кодировка URL AFAIK значение файла cookie по-прежнему является своего рода стандартом де-факто, это древний реликт, основанный на старых, уродливых спецификациях файлов cookie Netscape, в которых в основном говорится, что точки с запятой, запятые и пробелы запрещены и должны быть закодированы, например, с использованием кодировки URL. Это не требует ни кодирования, ни принудительного использования или кодирования URL, но именно так это было реализовано.
Поэтому при передаче строки конструктору WP_Http_Cookie
предполагается, что данные это из файла cookie, и поэтому значение файла cookie закодировано и должно быть декодировано. Лично я думаю, что этого не следует делать, и предоставьте разработчику обрабатывать значения по мере необходимости, как указано в Тикете 19922.
Однако при отправке запроса вызывается WP_Http_Cookie::getHeaderValue
, и именно здесь доступен фильтр, 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 только для ваших конкретных запросов.
Практически все реализации файлов cookie имеют URL-кодировку. Если вы отправляете необработанный файл cookie без кодирования, вам нужно контролировать оба конца конвейера. Поскольку вы этого не делаете, URL-кодируйте свои файлы cookie.