Errare humanum est
Сегодня в WordPress открылся баг (с самым высоким приоритетом — "highest omg bbq"). Симптомы его следующие: при публикации поста выдаётся ошибка вида:
Причина ошибки заключается в том, что WordPress недостаточно тщательно проверяет результат, который возвращают функции wp_remote_get()
/wp_remote_post()
.
Ошибка проявляется, когда функция WP_Http::chunkTransferDecode()
возвращает ошибку. Я не лез в дебри функции: возможно, сервер вернул что-то не то, возможно, декодер содержит ошибку, а может быть, виновата другая функция — важно здесь несколько другое: элемент body
возвращаемого результата может не быть скалярным.
Переходим к исправлению ошибки.
Официального решения пока не существует. Я предложил разработчикам патч, но от лица, сообщившего об ошибке, пока никакой реакции не последовало.
Те, у кого данная ошибка проявляется, могут попробовать применить данный патч:
===================================================================
--- wp-includes/comment.php (revision 10195)
+++ wp-includes/comment.php (working copy)
@@ -1261,6 +1261,9 @@
$contents = $response['body'];
+ if ( is_wp_error( $contents ) )
+ return false;
+
$pingback_link_offset_dquote = strpos($contents, $pingback_str_dquote);
$pingback_link_offset_squote = strpos($contents, $pingback_str_squote);
if ( $pingback_link_offset_dquote || $pingback_link_offset_squote ) {
Index: wp-includes/functions.php
===================================================================
--- wp-includes/functions.php (revision 10195)
+++ wp-includes/functions.php (working copy)
@@ -1276,7 +1276,7 @@
$response = wp_remote_get( $uri, $options );
- if ( is_wp_error( $response ) )
+ if ( is_wp_error( $response ) || is_wp_error( $response['body'] ) )
return false;
return $response['body'];
Index: wp-admin/update-links.php
===================================================================
--- wp-admin/update-links.php (revision 10195)
+++ wp-admin/update-links.php (working copy)
@@ -41,7 +41,7 @@
if ( is_wp_error( $response ) )
wp_die(__('Request Failed.'));
-if ( $response['response']['code'] != 200 )
+if ( $response['response']['code'] != 200 || is_wp_error( $response['body'] ) )
wp_die(__('Request Failed.'));
$body = str_replace(array("\r\n", "\r"), "\n", $response['body']);
Index: wp-admin/includes/plugin-install.php
===================================================================
--- wp-admin/includes/plugin-install.php (revision 10195)
+++ wp-admin/includes/plugin-install.php (working copy)
@@ -39,7 +39,7 @@
if ( ! $res ) {
$request = wp_remote_post('http://api.wordpress.org/plugins/info/1.0/', array( 'body' => array('action' => $action, 'request' => serialize($args))) );
- if ( is_wp_error($request) ) {
+ if ( is_wp_error($request) || is_wp_error($request['body']) ) {
$res = new WP_Error('plugins_api_failed', __('An Unexpected HTTP Error occured during the API request.</p> <p><a href="?" onclick="document.location.reload(); return false;">Try again</a>'), $request->get_error_message() );
} else {
$res = unserialize($request['body']);
Index: wp-admin/includes/file.php
===================================================================
--- wp-admin/includes/file.php (revision 10195)
+++ wp-admin/includes/file.php (working copy)
@@ -443,7 +443,7 @@
$response = wp_remote_get($url, array('timeout' => 30));
- if ( is_wp_error($response) ) {
+ if ( is_wp_error($response) || ( isset( $response['body'] ) && is_wp_error( $response['body'] ) ) ) {
fclose($handle);
unlink($tmpfname);
return $response;
Либо пропатченные файлы можно скачать у Lecactus'а.
Ввиду того, что официального решения нет до сих пор, я не могу дать гарантии стопроцентной правильности исправлений (тестировали — работает), поэтому я рекомендую их применять только в том случае, если Вы действительно столкнулись с данной ошибкой.
[...] сообщает Владимир Колесников, некоторые пользователи столкнулись с ошибкой при [...]
Ответить на данный комментарий