Я хочу отфильтровать любой URI HTTP-запроса через HTTP API.
Случаи использования:
- Проверка обновления WordPress идет по адресу http://api.wordpress.org/core/version-check/1.6/ , но https://api.wordpress.org/core/version-check/1.6/ тоже работает, и я хочу использовать это всегда.
- Новый файл WordPress взят из http://wordpress.org/wordpress-3.4.2.zip , но https://wordpress.org/wordpress-3.4.2.zip также работает.
- Иногда я хочу отладить запросы и перенаправить их временно в пользовательский домен на моем локальном сервере.
- Некоторые плагины отправляют запросы на другие серверы, и я хочу заменить эти запросы, когда внешний сервер отключается.
Запросы на обновление являются наиболее важными на данный момент, поскольку все еще существует нефиксированная ошибка 16778 ( дополнительная информация ), а HTTPS-запросы снижают риск атаки «человек посередине».
Я тщательно искал , я изучил основной код ... но закончил как Nacin два года назад:
Я думал, что вы можете отфильтровать URL-адрес HTTP-запроса, но сейчас я не могу его найти.
Что я пропустил? Не так ли? :)
Ответы:
Меньше, чем ответ, но просто список вещей прямо из моего опыта с ним - возможно, вы что-то упустили.
Отладка запроса и его результатов
Без diggin 'слишком глубоко в процессе обновления, но WP HTTP API использует
WP_HTTP
класс. Это также предлагает хорошую вещь: крюк отладки.Где
$response
также может бытьWP_Error
объект, который, возможно, говорит вам больше.Примечание. Из краткого теста кажется, что этот фильтр работает (по какой-то причине) только в том случае, если вы поместите его как можно ближе к месту выполнения запроса. Поэтому, возможно, вам нужно вызвать его из-за обратного вызова на одном из приведенных ниже фильтров.
WP_HTTP
Классовые аргументыАргументы Classes сами по себе фильтруемы, но некоторые из них возвращаются внутренними методами обратно к тому, что WP считает необходимым.
Одним из аргументов является то
ssl_verify
, что по умолчанию верно (но для меня это вызывает серьезные проблемы при обновлении, например, с GitHub). Редактировать: после отладки тестового запроса я нашел другой аргумент, который проверяет, установлен ли SSLtrue
. Это называетсяsslverify
(без разделения подчеркивания). Не знаю, где это появилось в игре, если оно действительно используется или заброшено, и если у вас есть шанс повлиять на его ценность. Я нашел это с помощью'http_api_debug'
фильтра.Полностью на заказ
Вы также можете «просто» переопределить все внутренние компоненты и перейти к пользовательской настройке. Для этого есть фильтр.
Первый аргумент должен быть установлен в true. Чем вы можете взаимодействовать с аргументами внутри
$r
и результатомparse_url( $url );
.полномочие
Еще одна вещь, которая может сработать, это запускать все через собственный прокси. Это требует некоторых настроек в вашем
wp-config.php
. Я никогда не пробовал этого раньше, но некоторое время назад я просмотрел константы и суммировал некоторые примеры, которые должны работать, и включил некоторые комментарии на случай, если мне это понадобится однажды. Вы должны определитьWP_PROXY_HOST
иWP_PROXY_PORT
как мин. установка. В противном случае ничего не будет работать, и это просто обойдет ваш прокси.РЕДАКТИРОВАТЬ
WP_HTTP
Класс обычно выступает в качестве базового класса (будет расширен для различных сценариев). ВыступающиеWP_HTTP_*
классыFsockopen
,Streams
,Curl
,Proxy
,Cookie
,Encoding
. Если вы подключите обратный вызов к'http_api_debug'
-action, то третий аргумент сообщит вам, какой класс использовался для вашего запроса.Внутри
WP_HTTP_curl
класса вы найдетеrequest()
метод. Этот метод предлагает два фильтра для перехвата поведения SSL: один для локальных запросов'https_local_ssl_verify'
и один для удаленных запросов'https_ssl_verify'
. WP, скорее всего, определитlocal
какlocalhost
и что вы получите взаменget_option( 'siteurl' );
.Поэтому я бы попробовал выполнить следующее прямо перед тем, как выполнить этот запрос (или из обратного вызова, который подключен к ближайшему запросу:
Sidenote: в большинстве случаев
WP_HTTP_curl
будет использоваться для работы с прокси.источник
pre_http_request
, отменить запрос и отправить его с правильным URL-адресом. Попробую это сегодня вечером.Основываясь на полезном ответе @ kaiser, я написал код, который, кажется, работает хорошо. Вот почему я отметил это как Ответ.
Позвольте мне объяснить мое решение ...
Логика
Когда выполняется запрос, отправленный через API
WP_Http::request()
. Это метод с ...... в заголовке. Я не мог согласиться больше.
Теперь есть несколько фильтров. Я решил неправильно использовать
pre_http_request
для моих нужд:Мы получаем три аргумента здесь:
false, $r, $url
.false
ожидаемое возвращаемое значение дляapply_filters()
. Если мы отправим что-нибудь еще назад, WordPress немедленно остановится, и исходный запрос не будет отправлен.$r
это массив аргументов для этого запроса. Мы должны изменить это тоже через минуту.$url
это - сюрприз! - URL.Таким образом , в нашем обратном вызове
t5_update_wp_per_https()
мы посмотрим на URL, и если это URL мы хотим фильтр, мы говорим НЕТ на WordPress с помощью не сказать «нет» (false
).Примечание: из этого следует, что вы можете предотвратить все HTTP-запросы:
add_filter( 'pre_http_request', '__return_true' );
Вместо этого мы запускаем наш собственный запрос с более точным URL-адресом и слегка скорректированными аргументами (
$r
переименованы$args
для удобства чтения)Код
Пожалуйста, прочитайте встроенные комментарии, они важны.
Тесты
Без этого плагина WordPress используется:
http://api.wordpress.org/core/version-check/1.6/
для проверки обновлений иhttp://wordpress.org/wordpress-3.4.2.zip
скачать новые файлы.Я тестировал его с двумя локальными установками, в одном месте и установкой нескольких сайтов на Win 7. Для того, чтобы заставить набор обновлений I
$wp_version
вwp-includes/version.php
до1
и версии TwentyEleven к1.3
.Для наблюдения за сетевым трафиком я использовал Wireshark : он бесплатный, работает на Windows и Linux и предлагает несколько впечатляющих инструментов фильтрации.
Смотреть HTTPS немного сложно: вы видите только зашифрованные данные ... в конце концов, это идея. Чтобы увидеть, сделал ли мой плагин то, что он должен делать, я сначала посмотрел незашифрованный трафик и заметил IP-адрес, используемый для подключения к wordpress.org. Это было
72.233.56.138
иногда72.233.56.139
.Не удивительно, что есть балансировщик нагрузки и, возможно, множество других инструментов, поэтому мы не можем полагаться на один IP-адрес.
Затем я набрал
ip.addr == 72.233.56.138
в маске фильтра, активировал плагин, зашелwp-admin/update-core.php
и наблюдал за трафиком в Wireshark. Зеленые линии - это запросы в виде простого текста - именно то, чего мы не хотим. Красные и черные линии являются признаком успеха.Проверка обновлений прошла нормально: обнаружены «более новые» версии. Актуальные обновления для темы и ядра тоже прошли нормально. Именно то, что мне было нужно.
И все же ... это может быть проще, если бы существовал простой фильтр для URL.
источник
/* /**/
, просто потому что это гений. И (если бы я мог) еще один +1 для Чарльза Бронсона. И тогда должен быть еще один +1 для подробного объяснения, комментариев и скриншотов.источник