Sulla base della risposta utile di @ kaiser, ho scritto del codice che sembra funzionare bene. Questo è il motivo per cui l'ho contrassegnato come la risposta.
Lasciami spiegare la mia soluzione ...
La logica
Quando viene eseguita una richiesta inviata tramite l'API WP_Http::request()
. Questo è il metodo con ...
@todo Refactor questo codice.
... nella sua intestazione. Non potrei essere più d'accordo.
Ora ci sono alcuni filtri. Ho deciso di abusare pre_http_request
delle mie esigenze:
add_filter( 'pre_http_request', 't5_update_wp_per_https', 10, 3 );
Otteniamo tre argomenti qui: false, $r, $url
.
false
è il valore di ritorno atteso per apply_filters()
. Se rispediamo qualcos'altro, WordPress si interrompe immediatamente e la richiesta originale non verrà inviata.
$r
è una matrice di argomenti per quella richiesta. Dobbiamo cambiare anche questi in un minuto.
$url
è - sorpresa! - l'URL.
Quindi nel nostro callback t5_update_wp_per_https()
guardiamo l'URL, e se è un URL che vogliamo filtrare, diciamo NO a WordPress non dicendo "no" ( false
).
Nota a margine: Di seguito puoi prevenire tutte le richieste HTTP con:
add_filter( 'pre_http_request', '__return_true' );
Accettiamo invece la nostra richiesta con un URL migliore e argomenti leggermente modificati ( $r
, rinominati in $args
per leggibilità).
Il codice
Si prega di leggere i commenti in linea, sono importanti.
<?php
/**
* Plugin Name: T5 Update WP per HTTPS
* Description: Forces update checks and downloads for WP to use HTTPS.
* Plugin URI: http://wordpress.stackexchange.com/questions/72529/filter-any-http-request-uri
* Version: 2012.11.14
* Author: Thomas Scholz
* Author URI: http://toscho.de
* Licence: MIT
* License URI: http://opensource.org/licenses/MIT
*/
add_filter( 'pre_http_request', 't5_update_wp_per_https', 10, 3 );
/**
* Force HTTPS requests for update checks and new WP version downloads.
*
* @wp-hook pre_http_request
* @param bool $false
* @param array $args
* @param string $url
* @return FALSE|array|object FALSE if everything is okay, an array of request
* results or an WP_Error instance.
*/
function t5_update_wp_per_https( $false, $args, $url )
{
// Split the URL into useful parts.
$url_data = parse_url( $url );
// It is already HTTPS.
if ( 'https' === strtolower( $url_data['scheme'] ) )
return FALSE;
// Not our host.
if ( FALSE === stripos( $url_data['host'], 'wordpress.org' ) )
return FALSE;
// Make that an HTTPS request.
$new_url = substr_replace( $url, 'https', 0, 4 );
// WP_Http cannot verify the wordpress.org certificate.
$args['sslverify'] = FALSE;
// It is slow. We wait at least 30 seconds.
30 > $args['timeout'] and $args['timeout'] = 30;
// Get an instance of WP_Http.
$http = _wp_http_get_object();
// Get the result.
$result = $http->request( $new_url, $args );
/* prepend this line with a '#' to debug like a boss.
print '<pre>'
. htmlspecialchars( print_r( $result, TRUE ), ENT_QUOTES, 'utf-8', FALSE )
. '</pre>';
die();
/**/
return $result;
}
I test
Senza quel plugin utilizzato da WordPress:
http://api.wordpress.org/core/version-check/1.6/
per i controlli di aggiornamento e
http://wordpress.org/wordpress-3.4.2.zip
per scaricare i nuovi file.
L'ho provato con due installazioni locali, un unico sito e una configurazione multi-sito su Win 7. Per forzare un set di aggiornamento I $wp_version
in wp-includes/version.php
a 1
e la versione di TwentyEleven a 1.3
.
Per guardare il traffico di rete ho usato Wireshark : è gratuito, funziona su Windows e Linux e offre alcuni strumenti di filtro impressionanti.
Guardare HTTPS è un po 'difficile: vedi solo dati crittografati ... questa è l'idea dopo tutto. Per vedere se il mio plugin ha fatto quello che dovrebbe fare, ho guardato prima il traffico non crittografato e ho notato l'indirizzo IP utilizzato per connettersi a wordpress.org. Quello era 72.233.56.138
, a volte 72.233.56.139
.
Non sorprende, esiste un bilanciamento del carico e probabilmente molti altri strumenti, quindi non possiamo fare affidamento su un indirizzo IP.
Quindi ho inserito ip.addr == 72.233.56.138
la maschera di filtro, attivato il plug-in, sono andato a wp-admin/update-core.php
cercare il traffico a Wireshark. Le linee verdi sono richieste in testo semplice, esattamente ciò che non vogliamo. Le linee rosse e nere sono un segno di successo.
Il controllo degli aggiornamenti è andato bene: ha trovato le versioni “più recenti”. Anche gli aggiornamenti effettivi per il tema e il nucleo sono andati bene. Esattamente quello di cui avevo bisogno.
E ancora ... ciò potrebbe essere più semplice se ci fosse un semplice filtro per l'URL.