Jetpack_Client::_wp_remote_request PHP Метод

_wp_remote_request() публичный статический Метод

This is lame, but many, many, many hosts have misconfigured SSL. When Jetpack is registered, the jetpack_fallback_no_verify_ssl_certs option is set to the current time if: 1. a certificate error is found AND 2. not verifying the certificate works around the problem. The option is checked on each request.
См. также: Jetpack::fix_url_for_bad_hosts()
public static _wp_remote_request ( $url, $args, $set_fallback = false ) : array | WP_Error
Результат array | WP_Error WP HTTP response on success
    public static function _wp_remote_request($url, $args, $set_fallback = false)
    {
        /**
         * SSL verification (`sslverify`) for the JetpackClient remote request
         * defaults to off, use this filter to force it on.
         *
         * Return `true` to ENABLE SSL verification, return `false`
         * to DISABLE SSL verification.
         *
         * @since 3.6.0
         *
         * @param bool Whether to force `sslverify` or not.
         */
        if (apply_filters('jetpack_client_verify_ssl_certs', false)) {
            return wp_remote_request($url, $args);
        }
        $fallback = Jetpack_Options::get_option('fallback_no_verify_ssl_certs');
        if (false === $fallback) {
            Jetpack_Options::update_option('fallback_no_verify_ssl_certs', 0);
        }
        if ((int) $fallback) {
            // We're flagged to fallback
            $args['sslverify'] = false;
        }
        $response = wp_remote_request($url, $args);
        if (!$set_fallback || isset($args['sslverify']) && !$args['sslverify'] || !is_wp_error($response)) {
            Jetpack_Client::set_time_diff($response, $set_fallback);
            return $response;
        }
        // At this point, we're not flagged to fallback and we are allowed to set the flag on this request.
        $message = $response->get_error_message();
        // Is it an SSL Certificate verification error?
        if (false === strpos($message, '14090086') && false === strpos($message, '1407E086') && false === strpos($message, 'error setting certificate verify locations') && false === strpos($message, 'Peer certificate cannot be authenticated with') && false === strpos($message, 'Problem with the SSL CA cert')) {
            // No, it is not.
            return $response;
        }
        // Redo the request without SSL certificate verification.
        $args['sslverify'] = false;
        $response = wp_remote_request($url, $args);
        if (!is_wp_error($response)) {
            // The request went through this time, flag for future fallbacks
            Jetpack_Options::update_option('fallback_no_verify_ssl_certs', time());
            Jetpack_Client::set_time_diff($response, $set_fallback);
        }
        return $response;
    }

Usage Example

Пример #1
0
 /**
  * @return bool|WP_Error
  */
 public static function register()
 {
     Jetpack_Options::update_option('register', wp_generate_password(32, false) . ':' . wp_generate_password(32, false) . ':' . (time() + 600));
     @(list($secret_1, $secret_2, $secret_eol) = explode(':', Jetpack_Options::get_option('register')));
     if (empty($secret_1) || empty($secret_2) || empty($secret_eol) || $secret_eol < time()) {
         return new Jetpack_Error('missing_secrets');
     }
     $timeout = (int) ini_get('max_execution_time');
     if (!$timeout) {
         $timeout = 30;
     }
     $timeout = intval($timeout / 2);
     $gmt_offset = get_option('gmt_offset');
     if (!$gmt_offset) {
         $gmt_offset = 0;
     }
     $stats_options = get_option('stats_options');
     $stats_id = isset($stats_options['blog_id']) ? $stats_options['blog_id'] : null;
     $args = array('method' => 'POST', 'body' => array('siteurl' => site_url(), 'home' => home_url(), 'gmt_offset' => $gmt_offset, 'timezone_string' => (string) get_option('timezone_string'), 'site_name' => (string) get_option('blogname'), 'secret_1' => $secret_1, 'secret_2' => $secret_2, 'site_lang' => get_locale(), 'timeout' => $timeout, 'stats_id' => $stats_id), 'headers' => array('Accept' => 'application/json'), 'timeout' => $timeout);
     $response = Jetpack_Client::_wp_remote_request(Jetpack::fix_url_for_bad_hosts(Jetpack::api_url('register')), $args, true);
     if (is_wp_error($response)) {
         return new Jetpack_Error('register_http_request_failed', $response->get_error_message());
     }
     $code = wp_remote_retrieve_response_code($response);
     $entity = wp_remote_retrieve_body($response);
     if ($entity) {
         $json = json_decode($entity);
     } else {
         $json = false;
     }
     $code_type = intval($code / 100);
     if (5 == $code_type) {
         return new Jetpack_Error('wpcom_5??', sprintf(__('Error Details: %s', 'jetpack'), $code), $code);
     } elseif (408 == $code) {
         return new Jetpack_Error('wpcom_408', sprintf(__('Error Details: %s', 'jetpack'), $code), $code);
     } elseif (!empty($json->error)) {
         $error_description = isset($json->error_description) ? sprintf(__('Error Details: %s', 'jetpack'), (string) $json->error_description) : '';
         return new Jetpack_Error((string) $json->error, $error_description, $code);
     } elseif (200 != $code) {
         return new Jetpack_Error('wpcom_bad_response', sprintf(__('Error Details: %s', 'jetpack'), $code), $code);
     }
     // Jetpack ID error block
     if (empty($json->jetpack_id)) {
         return new Jetpack_Error('jetpack_id', sprintf(__('Error Details: Jetpack ID is empty. Do not publicly post this error message! %s', 'jetpack'), $entity), $entity);
     } elseif (!is_scalar($json->jetpack_id)) {
         return new Jetpack_Error('jetpack_id', sprintf(__('Error Details: Jetpack ID is not a scalar. Do not publicly post this error message! %s', 'jetpack'), $entity), $entity);
     } elseif (preg_match('/[^0-9]/', $json->jetpack_id)) {
         return new Jetpack_Error('jetpack_id', sprintf(__('Error Details: Jetpack ID begins with a numeral. Do not publicly post this error message! %s', 'jetpack'), $entity), $entity);
     }
     if (empty($json->jetpack_secret) || !is_string($json->jetpack_secret)) {
         return new Jetpack_Error('jetpack_secret', '', $code);
     }
     if (isset($json->jetpack_public)) {
         $jetpack_public = (int) $json->jetpack_public;
     } else {
         $jetpack_public = false;
     }
     Jetpack_Options::update_options(array('id' => (int) $json->jetpack_id, 'blog_token' => (string) $json->jetpack_secret, 'public' => $jetpack_public));
     return true;
 }
All Usage Examples Of Jetpack_Client::_wp_remote_request