WordPress.org

Make WordPress Core

Ticket #2933: ping-4.patch

File ping-4.patch, 5.9 KB (added by c960657, 11 years ago)

Updated patch

  • wp-includes/comment.php

     
    668668
    669669
    670670function generic_ping($post_id = 0) {
     671        $errors = get_option('ping_errors');
     672        if ( !is_array($errors) )
     673                $errors = array();
    671674        $services = get_option('ping_sites');
    672675        $services = preg_replace("|(\s)+|", '$1', $services); // Kill dupe lines
    673676        $services = trim($services);
    674677        if ( '' != $services ) {
     678                $update_ping_sites = false;
    675679                $services = explode("\n", $services);
    676                 foreach ( (array) $services as $service )
    677                         weblog_ping($service);
     680                foreach ( (array) $services as $i => $service ) {
     681                        $error = weblog_ping($service);
     682                        if ( $error ) {
     683                                if ( !isset($errors[$service]) )
     684                                        $errors[$service] = array('count' => 0);
     685                                $errors[$service]['count']++;
     686                                $errors[$service]['last_message'] = $error;
     687                                $statusCode = preg_match('/HTTP status: (\d\d\d)/', $error, $reg) ? intval($reg[1]) : false;
     688                                // Remove servers that keep failing, and allow server owners
     689                                // to speed up the process by returning 403 Forbidden, 404
     690                                // Not Found or 410 Gone
     691                                if ( $errors[$service]['count'] > 20 ||
     692                                     $errors[$service]['count'] > 3 && in_array($statusCode, array(403, 404, 410))) {
     693
     694                                        unset($services[$i]);
     695                                        unset($errors[$service]);
     696                                        $update_ping_sites = true;
     697                                }
     698                        } else {
     699                                unset($errors[$service]);
     700                        }
     701                }
     702                if ($update_ping_sites)
     703                        update_option('ping_sites', implode("\n", $services));
    678704        }
     705        update_option('ping_errors', $errors);
    679706
    680707        return $post_id;
    681708}
     
    799826        // when set to true, this outputs debug messages by itself
    800827        $client->debug = false;
    801828        $home = trailingslashit( get_option('home') );
    802         if ( !$client->query('weblogUpdates.extendedPing', get_option('blogname'), $home, get_bloginfo('rss2_url') ) ) // then try a normal ping
     829        $client->query('weblogUpdates.extendedPing', get_option('blogname'), $home, get_bloginfo('rss2_url') );
     830        // If there was an XML-RPC service ("200" is a required but not sufficient
     831        // condition) but it did not know extendedPing, try a regular ping
     832        if ( $client->isError() && substr($client->getHttpStatus(), 0, 3) == '200' )
    803833                $client->query('weblogUpdates.ping', get_option('blogname'), $home);
     834
     835        $error = false;
     836        if ( $client->isError() ) {
     837                $httpStatus = $client->getHttpStatus();
     838                if ($httpStatus && substr($httpStatus, 0, 3) != '200')
     839                        $error = 'HTTP status: ' . $httpStatus;
     840                else
     841                        $error = $client->getErrorMessage();
     842        } else {
     843                $response = $client->getResponse();
     844                if ( !isset($response['flerror']) || $response['flerror'] ) {
     845                        $error = isset($response['message']) && $response['message']
     846                            ? $response['message'] : 'Invalid response';
     847                }
     848        }
     849        return $error;
    804850}
    805851
    806852//
  • wp-includes/class-IXR.php

     
    460460        var $timeout;
    461461    // Storage place for an error message
    462462    var $error = false;
     463    var $httpStatus = false;
    463464    function IXR_Client($server, $path = false, $port = 80, $timeout = false) {
    464465        if (!$path) {
    465466            // Assume we have been given a URL instead
     
    513514            $line = fgets($fp, 4096);
    514515            if (!$gotFirstLine) {
    515516                // Check line for '200'
    516                 if (strstr($line, '200') === false) {
    517                     $this->error = new IXR_Error(-32300, 'transport error - HTTP status code was not 200');
     517                if (preg_match('|^HTTP/1\.. ((\d\d\d) .*)|', $line, $reg)) {
     518                    $this->httpStatus = $reg[1];
     519                    if ($reg[2] != '200') {
     520                        $this->error = new IXR_Error(-32300, 'transport error - ' . $this->httpStatus);
     521                        return false;
     522                    }
     523                } else {
     524                    $this->error = new IXR_Error(-32300, 'transport error - no headers received' . $line);
    518525                    return false;
    519526                }
    520527                $gotFirstLine = true;
     
    554561    function getErrorCode() {
    555562        return $this->error->code;
    556563    }
     564    function getHttpStatus() {
     565        // e.g. "200 OK" or "404 Not found"
     566        return $this->httpStatus;
     567    }
    557568    function getErrorMessage() {
    558569        return $this->error->message;
    559570    }
  • wp-admin/options-writing.php

     
    102102
    103103<textarea name="ping_sites" id="ping_sites" style="width: 98%;" rows="3" cols="50"><?php form_option('ping_sites'); ?></textarea>
    104104
     105<p><?php _e('These update services failed your last update. You should consider removing these services from the list above.') ?></p>
     106<dl>
     107<?php
     108$has_errors = false;
     109$services = get_option('ping_sites');
     110$errors = get_option('ping_errors');
     111if (is_array($errors))
     112foreach (get_option('ping_errors') as $service => $error) :
     113if (preg_match('/(^|\s)' . preg_quote($service, '/') . '($|\s)/', $services)) :
     114echo "<dt>" . htmlspecialchars($service) . "</dt>";
     115echo "<dd>";
     116if ($error['count'] > 1) :
     117printf(__('Failed %d times. Last error message was: '), $error['count']);
     118endif;
     119echo htmlspecialchars($error['last_message']);
     120echo "</dd>";
     121$has_errors = true;
     122endif;
     123endforeach;
     124
     125if (!$has_errors) :
     126echo "<dd><em>" . __('No errors') . "</em></dd>";
     127endif;
     128?>
     129</dl>
     130
    105131<?php else : ?>
    106132
    107133        <p><?php printf(__('WordPress is not notifying any <a href="http://codex.wordpress.org/Update_Services">Update Services</a> because of your blog\'s <a href="%s">privacy settings</a>.'), 'options-privacy.php'); ?>
     
    118144</form>
    119145</div>
    120146
    121 <?php include('./admin-footer.php') ?>
    122  No newline at end of file
     147<?php include('./admin-footer.php') ?>