Quiero filtrar cualquier URI de solicitud HTTP realizada a través de la API HTTP.
Casos de uso:
- La verificación de actualización de WordPress va a http://api.wordpress.org/core/version-check/1.6/ , pero https://api.wordpress.org/core/version-check/1.6/ también funciona, y quiero para usar esto siempre.
- El nuevo archivo de WordPress está tomado de http://wordpress.org/wordpress-3.4.2.zip , pero https://wordpress.org/wordpress-3.4.2.zip también funciona.
- A veces quiero depurar solicitudes y redirigirlas temporalmente a un dominio personalizado en mi servidor local.
- Algunos complementos realizan solicitudes a otros servidores, y quiero reemplazar estas solicitudes cuando el servidor externo deja de funcionar.
Las solicitudes de actualización son las más importantes por ahora, porque todavía existe el error no corregido 16778 ( más información ), y las solicitudes HTTPS reducen el riesgo de un ataque Man-in-the-middle.
He buscado a fondo , he estudiado el código central ... pero terminé como Nacin hace dos años:
Pensé con seguridad que podría filtrar la URL de una solicitud HTTP, pero ahora no puedo encontrar una.
¿Qué me perdí? ¿Hice? :)
Respuestas:
Menos de una respuesta, pero solo una lista de cosas directamente de mi experiencia con él, tal vez has pasado por alto algo.
Depuración de la solicitud y sus resultados
Sin profundizar demasiado en el proceso de actualización, pero la API HTTP de WP usa la
WP_HTTP
clase. También ofrece algo agradable: un gancho de depuración.Donde
$response
también puede haber unWP_Error
objeto que quizás te diga más.Nota: a partir de una breve prueba, este filtro parece funcionar solo (por alguna razón) si lo coloca tan cerca de donde realmente está haciendo la solicitud. Entonces, tal vez deba llamarlo desde una devolución de llamada en uno de los siguientes filtros.
WP_HTTP
Argumentos de claseLos argumentos de las clases en sí son filtrables, pero algunos pueden restablecerse mediante los métodos internos de nuevo a lo que WP supone que es necesario.
Uno de los argumentos es
ssl_verify
, que es cierto por defecto (pero para mí causa problemas masivos al actualizar desde, por ejemplo, GitHub). Editar: después de depurar una solicitud de prueba, encontré otro argumento configurado para verificar si SSL está configurado comotrue
. Se llamasslverify
(sin separar el guión bajo). No tengo idea de dónde entró esto en el juego, si realmente está en uso o abandonado y si tienes la oportunidad de influir en su valor. Lo encontré usando el'http_api_debug'
filtro.Completamente personalizado
También puede "simplemente" anular todas las partes internas e ir con una configuración personalizada. Hay un filtro para eso.
El primer argumento debe establecerse en verdadero. Entonces puedes interactuar con los argumentos dentro
$r
y el resultado deparse_url( $url );
.Apoderado
Otra cosa que podría funcionar podría ser ejecutar todo a través de un Proxy personalizado. Esto necesita algunas configuraciones en su
wp-config.php
. Nunca he intentado esto antes, pero revisé las constantes hace un tiempo y resumí algunos ejemplos que deberían funcionar e incluí algunos comentarios en caso de que algún día lo necesite. Tienes que definirWP_PROXY_HOST
yWP_PROXY_PORT
como min. ajuste. De lo contrario, nada funcionará y simplemente pasará por alto su proxy.EDITAR
La
WP_HTTP
clase normalmente actúa como clase base (se extenderá para diferentes escenarios). Los extiendenWP_HTTP_*
clases sonFsockopen
,Streams
,Curl
,Proxy
,Cookie
,Encoding
. Si'http_api_debug'
conecta una devolución de llamada a la acción, el tercer argumento le dirá qué clase se utilizó para su solicitud.Dentro de la
WP_HTTP_curl
clase, encontrarás elrequest()
método. Este método ofrece dos filtros para interceptar el comportamiento SSL: uno para solicitudes locales'https_local_ssl_verify'
y otro para solicitudes remotas'https_ssl_verify'
. WP probablemente definirálocal
comolocalhost
y de qué obtienes a cambioget_option( 'siteurl' );
.Entonces, lo que debería hacer es intentar lo siguiente justo antes de hacer esa solicitud (o de una devolución de llamada que esté conectada a la solicitud más cercana:
Nota al margen: en la mayoría de los casos
WP_HTTP_curl
se utilizará para manejar Proxies.fuente
pre_http_request
, cancelar la solicitud y volver a enviarla con la URL correcta. Lo intentaremos esta noche.Basado en la útil respuesta de @ kaiser, he escrito un código que parece funcionar bien. Esa es la razón por la que lo marqué como La respuesta.
Déjame explicarte mi solución ...
La lógica
Cuando se ejecuta una solicitud enviada a través de la API
WP_Http::request()
. Ese es el método con ...... en su encabezado. No podría estar mas de acuerdo.
Ahora, hay algunos filtros. Decidí hacer un mal uso
pre_http_request
para mis necesidades:Obtenemos tres argumentos aquí:
false, $r, $url
.false
es el valor de retorno esperado paraapply_filters()
. Si devolvemos algo más, WordPress se detiene de inmediato y no se enviará la solicitud original.$r
es una matriz de argumentos para esa solicitud. Tenemos que cambiar esto también en un minuto.$url
es - sorpresa! - la URLEntonces, en nuestra devolución de llamada
t5_update_wp_per_https()
miramos la URL, y si es una URL que queremos filtrar, decimos NO a WordPress al no decir "no" (false
).Nota al margen: a continuación puede evitar todas las solicitudes HTTP con:
add_filter( 'pre_http_request', '__return_true' );
En su lugar, activamos nuestra propia solicitud con una mejor URL y argumentos ligeramente ajustados (
$r
rebautizados$args
para facilitar la lectura).El código
Lea los comentarios en línea, son importantes.
Los exámenes
Sin ese complemento, WordPress utilizó:
http://api.wordpress.org/core/version-check/1.6/
para verificaciones de actualizaciones, yhttp://wordpress.org/wordpress-3.4.2.zip
para descargar los nuevos archivos.Lo he comprobado con dos instalaciones locales, un sitio único y una configuración multi-sitio en Windows 7. Para forzar una actualización de conjunto que
$wp_version
enwp-includes/version.php
a1
, y la versión de TwentyEleven a1.3
.Para ver el tráfico de la red, utilicé Wireshark : es gratis, se ejecuta en Windows y Linux, y ofrece algunas herramientas de filtro impresionantes.
Ver HTTPS es un poco difícil: ves datos cifrados ... esa es la idea después de todo. Para ver si mi complemento hizo lo que debería hacer, observé primero el tráfico no cifrado y noté la dirección IP utilizada para conectarme a wordpress.org. Eso fue
72.233.56.138
, a veces72.233.56.139
.No es sorprendente, hay un equilibrador de carga y probablemente muchas otras herramientas, por lo que no podemos confiar en una sola dirección IP.
Luego escribí
ip.addr == 72.233.56.138
en la máscara de filtro, activé el complemento, fuiwp-admin/update-core.php
y observé el tráfico en Wireshark. Las líneas verdes son solicitudes en texto plano, exactamente lo que no queremos. Las líneas rojas y negras son un signo de éxito.El chequeo de actualización salió bien: encontró las versiones "más nuevas". Las actualizaciones reales para el tema y el núcleo también funcionaron bien. Exactamente lo que necesitaba.
Y aún así ... eso podría ser más fácil si hubiera un filtro simple para la URL.
fuente
/* /**/
, solo porque es genial. Y (si pudiera) otro +1 para Charles Bronson. Y luego debería haber otro +1 para la explicación detallada, comentarios y capturas de pantalla.fuente