Make WordPress Core

Changeset 9012


Ignore:
Timestamp:
09/27/2008 09:40:09 PM (18 years ago)
Author:
westi
Message:

Move the pingbacks and trackbacks to the new HTTP api. See #7793 props jacobsantos.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/wp-includes/comment.php

    r8956 r9012  
    10521052 *
    10531053 * @since 1.5.0
    1054  * @uses $wp_version
    10551054 *
    10561055 * @param string $url URL to ping.
    1057  * @param int $timeout_bytes Number of bytes to timeout at. Prevents big file downloads, default is 2048.
     1056 * @param int $deprecated Not Used.
    10581057 * @return bool|string False on failure, string containing URI on success.
    10591058 */
    1060 function discover_pingback_server_uri($url, $timeout_bytes = 2048) {
    1061         global $wp_version;
    1062 
    1063         $byte_count = 0;
    1064         $contents = '';
    1065         $headers = '';
     1059function discover_pingback_server_uri($url, $deprecated = 2048) {
     1060
    10661061        $pingback_str_dquote = 'rel="pingback"';
    10671062        $pingback_str_squote = 'rel=\'pingback\'';
    1068         $x_pingback_str = 'x-pingback: ';
    1069 
    1070         extract(parse_url($url), EXTR_SKIP);
    1071 
    1072         if ( !isset($host) ) // Not an URL. This should never happen.
     1063
     1064        /** @todo Should use Filter Extension or custom preg_match instead. */
     1065        $parsed_url = parse_url($url);
     1066
     1067        if ( ! isset( $parsed_url['host'] ) ) // Not an URL. This should never happen.
    10731068                return false;
    10741069
    1075         $path  = ( !isset($path) ) ? '/'          : $path;
    1076         $path .= ( isset($query) ) ? '?' . $query : '';
    1077         $port  = ( isset($port)  ) ? $port        : 80;
    1078 
    1079         // Try to connect to the server at $host
    1080         $fp = @fsockopen($host, $port, $errno, $errstr, 2);
    1081         if ( !$fp ) // Couldn't open a connection to $host
     1070        $response = wp_remote_get( $url, array( 'timeout' => 2, 'httpversion' => '1.1' ) );
     1071
     1072        if ( is_wp_error( $response ) )
    10821073                return false;
    10831074
    1084         // Send the GET request
    1085         $request = "GET $path HTTP/1.1\r\nHost: $host\r\nUser-Agent: WordPress/$wp_version \r\n\r\n";
    1086         // ob_end_flush();
    1087         fputs($fp, $request);
    1088 
    1089         // Let's check for an X-Pingback header first
    1090         while ( !feof($fp) ) {
    1091                 $line = fgets($fp, 512);
    1092                 if ( trim($line) == '' )
    1093                         break;
    1094                 $headers .= trim($line)."\n";
    1095                 $x_pingback_header_offset = strpos(strtolower($headers), $x_pingback_str);
    1096                 if ( $x_pingback_header_offset ) {
    1097                         // We got it!
    1098                         preg_match('#x-pingback: (.+)#is', $headers, $matches);
    1099                         $pingback_server_url = trim($matches[1]);
     1075        if ( isset( $response['headers']['x-pingback'] ) )
     1076                return $response['headers']['x-pingback'];
     1077
     1078        // Not an (x)html, sgml, or xml page, no use going further.
     1079        if ( isset( $response['headers']['content-type'] ) && preg_match('#(image|audio|video|model)/#is', $response['headers']['content-type']) )
     1080                return false;
     1081
     1082        $contents = $response['body'];
     1083
     1084        $pingback_link_offset_dquote = strpos($contents, $pingback_str_dquote);
     1085        $pingback_link_offset_squote = strpos($contents, $pingback_str_squote);
     1086        if ( $pingback_link_offset_dquote || $pingback_link_offset_squote ) {
     1087                $quote = ($pingback_link_offset_dquote) ? '"' : '\'';
     1088                $pingback_link_offset = ($quote=='"') ? $pingback_link_offset_dquote : $pingback_link_offset_squote;
     1089                $pingback_href_pos = @strpos($contents, 'href=', $pingback_link_offset);
     1090                $pingback_href_start = $pingback_href_pos+6;
     1091                $pingback_href_end = @strpos($contents, $quote, $pingback_href_start);
     1092                $pingback_server_url_len = $pingback_href_end - $pingback_href_start;
     1093                $pingback_server_url = substr($contents, $pingback_href_start, $pingback_server_url_len);
     1094
     1095                // We may find rel="pingback" but an incomplete pingback URL
     1096                if ( $pingback_server_url_len > 0 ) { // We got it!
    11001097                        return $pingback_server_url;
    11011098                }
    1102                 if ( strpos(strtolower($headers), 'content-type: ') ) {
    1103                         preg_match('#content-type: (.+)#is', $headers, $matches);
    1104                         $content_type = trim($matches[1]);
    1105                 }
    1106         }
    1107 
    1108         if ( preg_match('#(image|audio|video|model)/#is', $content_type) ) // Not an (x)html, sgml, or xml page, no use going further
    1109                 return false;
    1110 
    1111         while ( !feof($fp) ) {
    1112                 $line = fgets($fp, 1024);
    1113                 $contents .= trim($line);
    1114                 $pingback_link_offset_dquote = strpos($contents, $pingback_str_dquote);
    1115                 $pingback_link_offset_squote = strpos($contents, $pingback_str_squote);
    1116                 if ( $pingback_link_offset_dquote || $pingback_link_offset_squote ) {
    1117                         $quote = ($pingback_link_offset_dquote) ? '"' : '\'';
    1118                         $pingback_link_offset = ($quote=='"') ? $pingback_link_offset_dquote : $pingback_link_offset_squote;
    1119                         $pingback_href_pos = @strpos($contents, 'href=', $pingback_link_offset);
    1120                         $pingback_href_start = $pingback_href_pos+6;
    1121                         $pingback_href_end = @strpos($contents, $quote, $pingback_href_start);
    1122                         $pingback_server_url_len = $pingback_href_end - $pingback_href_start;
    1123                         $pingback_server_url = substr($contents, $pingback_href_start, $pingback_server_url_len);
    1124                         // We may find rel="pingback" but an incomplete pingback URL
    1125                         if ( $pingback_server_url_len > 0 ) { // We got it!
    1126                                 fclose($fp);
    1127                                 return $pingback_server_url;
    1128                         }
    1129                 }
    1130                 $byte_count += strlen($line);
    1131                 if ( $byte_count > $timeout_bytes ) {
    1132                         // It's no use going further, there probably isn't any pingback
    1133                         // server to find in this file. (Prevents loading large files.)
    1134                         fclose($fp);
    1135                         return false;
    1136                 }
    1137         }
    1138 
    1139         // We didn't find anything.
    1140         fclose($fp);
     1099        }
     1100
    11411101        return false;
    11421102}
    … …  
    13331293 * @since 0.71
    13341294 * @uses $wpdb
    1335  * @uses $wp_version WordPress version
    13361295 *
    13371296 * @param string $trackback_url URL to send trackbacks.
    … …  
    13421301 */
    13431302function trackback($trackback_url, $title, $excerpt, $ID) {
    1344         global $wpdb, $wp_version;
     1303        global $wpdb;
    13451304
    13461305        if ( empty($trackback_url) )
    13471306                return;
    13481307
    1349         $title = urlencode($title);
    1350         $excerpt = urlencode($excerpt);
    1351         $blog_name = urlencode(get_option('blogname'));
    1352         $tb_url = $trackback_url;
    1353         $url = urlencode(get_permalink($ID));
    1354         $query_string = "title=$title&url=$url&blog_name=$blog_name&excerpt=$excerpt";
    1355         $trackback_url = parse_url($trackback_url);
    1356         $http_request = 'POST ' . $trackback_url['path'] . ($trackback_url['query'] ? '?'.$trackback_url['query'] : '') . " HTTP/1.0\r\n";
    1357         $http_request .= 'Host: '.$trackback_url['host']."\r\n";
    1358         $http_request .= 'Content-Type: application/x-www-form-urlencoded; charset='.get_option('blog_charset')."\r\n";
    1359         $http_request .= 'Content-Length: '.strlen($query_string)."\r\n";
    1360         $http_request .= "User-Agent: WordPress/" . $wp_version;
    1361         $http_request .= "\r\n\r\n";
    1362         $http_request .= $query_string;
    1363         if ( '' == $trackback_url['port'] )
    1364                 $trackback_url['port'] = 80;
    1365         $fs = @fsockopen($trackback_url['host'], $trackback_url['port'], $errno, $errstr, 4);
    1366         @fputs($fs, $http_request);
    1367         @fclose($fs);
    1368 
    1369         $tb_url = addslashes( $tb_url );
     1308        $options = array();
     1309        $options['timeout'] = 4;
     1310        $options['body'] = array(
     1311                'title' => urlencode($title),
     1312                'url' => urlencode(get_permalink($ID)),
     1313                'blog_name' => urlencode(get_option('blogname')),
     1314                'excerpt' => urlencode($excerpt)
     1315        );
     1316
     1317        wp_remote_post($trackback_url, $options);
     1318
     1319        $tb_url = addslashes( $trackback_url );
    13701320        $wpdb->query( $wpdb->prepare("UPDATE $wpdb->posts SET pinged = CONCAT(pinged, '\n', '$tb_url') WHERE ID = %d", $ID) );
    13711321        return $wpdb->query( $wpdb->prepare("UPDATE $wpdb->posts SET to_ping = TRIM(REPLACE(to_ping, '$tb_url', '')) WHERE ID = %d", $ID) );
Note: See TracChangeset for help on using the changeset viewer.