Changeset 9012
- Timestamp:
- 09/27/2008 09:40:09 PM (17 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/wp-includes/comment.php
r8956 r9012 1052 1052 * 1053 1053 * @since 1.5.0 1054 * @uses $wp_version1055 1054 * 1056 1055 * @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. 1058 1057 * @return bool|string False on failure, string containing URI on success. 1059 1058 */ 1060 function discover_pingback_server_uri($url, $timeout_bytes = 2048) { 1061 global $wp_version; 1062 1063 $byte_count = 0; 1064 $contents = ''; 1065 $headers = ''; 1059 function discover_pingback_server_uri($url, $deprecated = 2048) { 1060 1066 1061 $pingback_str_dquote = 'rel="pingback"'; 1067 1062 $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. 1073 1068 return false; 1074 1069 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 ) ) 1082 1073 return false; 1083 1074 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! 1100 1097 return $pingback_server_url; 1101 1098 } 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 1141 1101 return false; 1142 1102 } … … 1333 1293 * @since 0.71 1334 1294 * @uses $wpdb 1335 * @uses $wp_version WordPress version1336 1295 * 1337 1296 * @param string $trackback_url URL to send trackbacks. … … 1342 1301 */ 1343 1302 function trackback($trackback_url, $title, $excerpt, $ID) { 1344 global $wpdb , $wp_version;1303 global $wpdb; 1345 1304 1346 1305 if ( empty($trackback_url) ) 1347 1306 return; 1348 1307 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 ); 1370 1320 $wpdb->query( $wpdb->prepare("UPDATE $wpdb->posts SET pinged = CONCAT(pinged, '\n', '$tb_url') WHERE ID = %d", $ID) ); 1371 1321 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.