Quero filtrar qualquer URI de solicitação HTTP feito por meio da API HTTP.
Casos de uso:
- A verificação de atualização do WordPress vai para http://api.wordpress.org/core/version-check/1.6/ , mas https://api.wordpress.org/core/version-check/1.6/ também funciona, e eu quero para usar isso sempre.
- O novo arquivo WordPress é obtido em http://wordpress.org/wordpress-3.4.2.zip , mas https://wordpress.org/wordpress-3.4.2.zip também funciona.
- Às vezes, quero depurar solicitações e redirecionar as temporárias para um domínio personalizado no meu servidor local.
- Alguns plug-ins fazem solicitações para outros servidores e quero substituí-las quando o servidor externo ficar inoperante.
As solicitações de atualização são as mais importantes por enquanto, porque ainda existe o bug não corrigido 16778 ( mais informações ), e as solicitações de HTTPS diminuem o risco de um ataque do tipo intermediário.
Eu pesquisei minuciosamente , estudei o código principal ... mas acabei como Nacin há dois anos:
Eu pensei que você poderia filtrar a URL de uma solicitação HTTP, mas agora não consigo encontrar uma.
Do que eu senti falta? Eu fiz? :)
Respostas:
Menos que uma resposta, mas apenas uma lista de coisas diretamente da minha experiência com ela - talvez você tenha esquecido alguma coisa.
Depurando a solicitação e seus resultados
Sem aprofundar muito no processo de atualização, mas a API HTTP do WP usa a
WP_HTTP
classe Ele também oferece uma coisa interessante: um gancho de depuração.Onde
$response
também pode ser umWP_Error
objeto que talvez lhe conte mais.Nota: A partir de um breve teste, esse filtro parece funcionar (por algum motivo) apenas se você o colocar o mais próximo de onde você está realmente fazendo a solicitação. Talvez você precise chamá-lo em um retorno de chamada em um dos filtros abaixo.
WP_HTTP
Argumentos de classeOs argumentos de Classes em si são filtráveis, mas alguns são redefinidos pelos métodos internos de volta ao que o WP assume que é necessário.
Um dos argumentos é o
ssl_verify
que é verdadeiro por padrão (mas para mim causa grandes problemas ao atualizar - por exemplo - GitHub). Edit: Depois de depurar uma solicitação de teste, encontrei outro argumento definido para verificar se o SSL está definido comotrue
. É chamadosslverify
(sem separar o sublinhado). Não faço ideia de onde isso entrou no jogo, se ele está realmente em uso ou abandonado e se você tem uma chance de influenciar seu valor. Encontrei-o usando o'http_api_debug'
filtro.Completamente personalizado
Você também pode "simplesmente" substituir todos os componentes internos e fazer uma configuração personalizada. Existe um filtro para isso.
O primeiro argumento precisa ser definido como verdadeiro. Do que você pode interagir com os argumentos internos
$r
e com o resultadoparse_url( $url );
.Proxy
Outra coisa que pode funcionar pode ser executar tudo por meio de um Proxy personalizado. Isso precisa de algumas configurações no seu
wp-config.php
. Eu nunca tentei isso antes, mas repassei as constantes há algum tempo e resumi alguns exemplos que deveriam funcionar e incluí alguns comentários, caso eu precise um dia. Você tem que definirWP_PROXY_HOST
eWP_PROXY_PORT
como um min. configuração. Caso contrário, nada funcionará e simplesmente ignorará seu proxy.EDITAR
A
WP_HTTP
classe normalmente atua como classe base (será estendida para diferentes cenários). Os que se estendemWP_HTTP_*
classes sãoFsockopen
,Streams
,Curl
,Proxy
,Cookie
,Encoding
. Se você conectar um retorno de chamada à'http_api_debug'
ação-, o terceiro argumento informará qual classe foi usada para sua solicitação.Dentro da
WP_HTTP_curl
classe, você encontrará orequest()
método. Este método oferece dois filtros para interceptar o comportamento do SSL: um para solicitações locais'https_local_ssl_verify'
e outro para solicitações remotas'https_ssl_verify'
. O WP provavelmente definirálocal
comolocalhost
e o que você recebe em trocaget_option( 'siteurl' );
.Então, o que eu faria é tentar o seguinte logo antes de fazer essa solicitação (ou de um retorno de chamada vinculado à solicitação mais próxima:
Nota: Na maioria dos casos
WP_HTTP_curl
, será usado para manipular proxies.fonte
pre_http_request
, cancelar a solicitação e reenviá-la com o URL correto. Vai tentar isso hoje à noite.Com base na resposta útil do @ kaiser, escrevi um código que parece funcionar bem. Essa é a razão pela qual eu o marquei como A resposta.
Deixe-me explicar minha solução ...
A lógica
Quando uma solicitação enviada pela API é executada
WP_Http::request()
. Esse é o método com ...... no cabeçalho. Eu não poderia concordar mais.
Agora, existem alguns filtros. Decidi usar indevidamente
pre_http_request
para minhas necessidades:Ficamos com três argumentos aqui:
false, $r, $url
.false
é o valor de retorno esperado paraapply_filters()
. Se enviarmos mais alguma coisa de volta, o WordPress será interrompido imediatamente e a solicitação original não será enviada.$r
é uma matriz de argumentos para essa solicitação. Temos que mudar isso também em um minuto.$url
é - surpresa! - o URL.Portanto, em nosso retorno de chamada
t5_update_wp_per_https()
, examinamos a URL e, se for uma URL que queremos filtrar, dizemos NÃO ao WordPress por não dizer "não" (false
).Nota: A seguir, você pode impedir todas as solicitações HTTP com:
add_filter( 'pre_http_request', '__return_true' );
Em vez disso, acionamos nossa própria solicitação com uma URL melhor e argumentos ligeiramente ajustados (
$r
renomeados$args
para facilitar a leitura).O código
Por favor, leia os comentários em linha, eles são importantes.
Os testes
Sem esse plugin, o WordPress usado:
http://api.wordpress.org/core/version-check/1.6/
para verificações de atualização ehttp://wordpress.org/wordpress-3.4.2.zip
para baixar os novos arquivos.Eu testei com duas instalações locais, um único site e uma organização multi-site no Win 7. Para forçar uma atualização do conjunto de I
$wp_version
emwp-includes/version.php
para1
ea versão do TwentyEleven para1.3
.Para assistir ao tráfego de rede, usei o Wireshark : é gratuito, roda em Windows e Linux e oferece algumas ferramentas de filtro impressionantes.
Observar HTTPS é um pouco difícil: você vê apenas dados criptografados ... essa é a ideia, afinal. Para ver se meu plug-in fez o que deveria, observei primeiro o tráfego não criptografado e observei o endereço IP usado para conectar ao wordpress.org. Isso foi
72.233.56.138
, às vezes72.233.56.139
.Não é de surpreender, há um balanceador de carga e provavelmente muitas outras ferramentas, portanto não podemos confiar em um endereço IP.
Então, digitei
ip.addr == 72.233.56.138
a máscara de filtro, ativei o plug-in, fuiwp-admin/update-core.php
e observei o tráfego no Wireshark. Linhas verdes são solicitações em texto simples - exatamente o que não queremos. As linhas vermelhas e pretas são um sinal de sucesso.A verificação da atualização foi boa: encontrou as versões "mais recentes". As atualizações reais para o tema e o núcleo também foram boas. Exatamente o que eu precisava.
E ainda assim ... isso seria mais fácil se houvesse um filtro simples para o URL.
fonte
/* /**/
, apenas porque é genial. E (se eu pudesse) outro +1 para Charles Bronson. E então deve haver outro +1 para a explicação detalhada, comentários e capturas de tela.fonte