Make WordPress Core

Changeset 1709


Ignore:
Timestamp:
09/24/2004 05:29:25 PM (22 years ago)
Author:
michelvaldrighi
Message:

added discover_pingback_server_uri, should dramatically speed things up

File:
1 edited

Legend:

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

    r1696 r1709  
    639639        $log = debug_fopen('./pingback.log', 'a');
    640640        $post_links = array();
    641         debug_fwrite($log, 'BEGIN '.time()."\n");
     641        debug_fwrite($log, 'BEGIN '.date('YmdHis', time())."\n");
    642642
    643643        // Variables
     
    646646        $punc = '.:?\-';
    647647        $any = $ltrs.$gunk.$punc;
    648         $pingback_str_dquote = 'rel="pingback"';
    649         $pingback_str_squote = 'rel=\'pingback\'';
    650         $x_pingback_str = 'x-pingback: ';
    651         $pingback_href_original_pos = 27;
    652648
    653649        // Step 1
     
    680676
    681677        foreach ($post_links as $pagelinkedto){
    682                 debug_fwrite($log, 'Processing -- '.$pagelinkedto."\n\n");
    683 
    684                 $bits = parse_url($pagelinkedto);
    685                 if (!isset($bits['host'])) {
    686                         debug_fwrite($log, 'Couldn\'t find a hostname for '.$pagelinkedto."\n\n");
    687                         continue;
    688                 }
    689                 $host = $bits['host'];
    690                 $path = isset($bits['path']) ? $bits['path'] : '';
    691                 if (isset($bits['query'])) {
    692                         $path .= '?'.$bits['query'];
    693                 }
    694                 if (!$path) {
    695                         $path = '/';
    696                 }
    697                 $port = isset($bits['port']) ? $bits['port'] : 80;
    698 
    699                 // Try to connect to the server at $host
    700                 $fp = fsockopen($host, $port, $errno, $errstr, 3);
    701                 if (!$fp) {
    702                         debug_fwrite($log, 'Couldn\'t open a connection to '.$host."\n\n");
    703                         continue;
    704                 }
    705 
    706                 // Send the GET request
    707                 $request = "GET $path HTTP/1.1\r\nHost: $host\r\nUser-Agent: WordPress/$wp_version PHP/" . phpversion() . "\r\n\r\n";
    708                 ob_end_flush();
    709                 fputs($fp, $request);
    710 
    711                 // Start receiving headers and content
    712                 $contents = '';
    713                 $headers = '';
    714                 $gettingHeaders = true;
    715                 $found_pingback_server = 0;
    716                 while (!feof($fp)) {
    717                         $line = fgets($fp, 4096);
    718                         if (trim($line) == '') {
    719                                 $gettingHeaders = false;
    720                         }
    721                         if (!$gettingHeaders) {
    722                                 $contents .= trim($line)."\n";
    723                                 $pingback_link_offset_dquote = strpos($contents, $pingback_str_dquote);
    724                                 $pingback_link_offset_squote = strpos($contents, $pingback_str_squote);
    725                         } else {
    726                                 $headers .= trim($line)."\n";
    727                                 $x_pingback_header_offset = strpos(strtolower($headers), $x_pingback_str);
    728                         }
    729                         if ($x_pingback_header_offset) {
    730                                 preg_match('#x-pingback: (.+)#is', $headers, $matches);
    731                                 $pingback_server_url = trim($matches[1]);
    732                                 debug_fwrite($log, "Pingback server found from X-Pingback header @ $pingback_server_url\n");
    733                                 $found_pingback_server = 1;
    734                                 break;
    735                         }
    736                         if ($pingback_link_offset_dquote || $pingback_link_offset_squote) {
    737                                 $quote = ($pingback_link_offset_dquote) ? '"' : '\'';
    738                                 $pingback_link_offset = ($quote=='"') ? $pingback_link_offset_dquote : $pingback_link_offset_squote;
    739                                 $pingback_href_pos = @strpos($contents, 'href=', $pingback_link_offset);
    740                                 $pingback_href_start = $pingback_href_pos+6;
    741                                 $pingback_href_end = @strpos($contents, $quote, $pingback_href_start);
    742                                 $pingback_server_url_len = $pingback_href_end-$pingback_href_start;
    743                                 $pingback_server_url = substr($contents, $pingback_href_start, $pingback_server_url_len);
    744                                 debug_fwrite($log, "Pingback server found from Pingback <link /> tag @ $pingback_server_url\n");
    745                                 $found_pingback_server = 1;
    746                                 break;
    747                         }
    748                 }
    749 
    750                 if (!$found_pingback_server) {
    751                         debug_fwrite($log, "Pingback server not found\n\n*************************\n\n");
    752                         @fclose($fp);
    753                 } else {
     678
     679                debug_fwrite($log, "Processing -- $pagelinkedto\n");
     680                $pingback_server_url = discover_pingback_server_uri($pagelinkedto, 2048);
     681
     682                if($pingback_server_url) {
    754683
    755684                         // Now, the RPC call
     
    778707        debug_fclose($log);
    779708}
     709
     710function discover_pingback_server_uri($url, $timeout_bytes = 2048) {
     711
     712        $byte_count = 0;
     713        $contents = '';
     714        $headers = '';
     715        $pingback_str_dquote = 'rel="pingback"';
     716        $pingback_str_squote = 'rel=\'pingback\'';
     717        $x_pingback_str = 'x-pingback: ';
     718        $pingback_href_original_pos = 27;
     719
     720        extract(parse_url($url));
     721
     722        if (!isset($host)) {
     723                // Not an URL. This should never happen.
     724                return false;
     725        }
     726
     727        $path  = (!isset($path)) ? '/'        : $path;
     728        $path .= (isset($query)) ? '?'.$query : '';
     729        $port  = (isset($port))  ? $port      : 80;
     730
     731        // Try to connect to the server at $host
     732        $fp = fsockopen($host, $port, $errno, $errstr, 3);
     733        if (!$fp) {
     734                // Couldn't open a connection to $host;
     735                return false;
     736        }
     737
     738        // Send the GET request
     739        $request = "GET $path HTTP/1.1\r\nHost: $host\r\nUser-Agent: WordPress/$wp_version PHP/" . phpversion() . "\r\n\r\n";
     740        ob_end_flush();
     741        fputs($fp, $request);
     742
     743        // Let's check for an X-Pingback header first
     744        while (!feof($fp)) {
     745                $line = fgets($fp, 512);
     746                if (trim($line) == '') {
     747                        break;
     748                }
     749                $headers .= trim($line)."\n";
     750                $x_pingback_header_offset = strpos(strtolower($headers), $x_pingback_str);
     751                if ($x_pingback_header_offset) {
     752                        // We got it!
     753                        preg_match('#x-pingback: (.+)#is', $headers, $matches);
     754                        $pingback_server_url = trim($matches[1]);
     755                        return $pingback_server_url;
     756                }
     757                if(strpos(strtolower($headers), 'content-type: ')) {
     758                        preg_match('#content-type: (.+)#is', $headers, $matches);
     759                        $content_type = trim($matches[1]);
     760                }
     761        }
     762
     763        if (preg_match('#(image|audio|video|model)/#is', $content_type)) {
     764                // Not an (x)html, sgml, or xml page, no use going further
     765                return false;
     766        }
     767
     768        while (!feof($fp)) {
     769                $line = fgets($fp, 1024);
     770                $contents .= trim($line);
     771                $pingback_link_offset_dquote = strpos($contents, $pingback_str_dquote);
     772                $pingback_link_offset_squote = strpos($contents, $pingback_str_squote);
     773                if ($pingback_link_offset_dquote || $pingback_link_offset_squote) {
     774                        $quote = ($pingback_link_offset_dquote) ? '"' : '\'';
     775                        $pingback_link_offset = ($quote=='"') ? $pingback_link_offset_dquote : $pingback_link_offset_squote;
     776                        $pingback_href_pos = @strpos($contents, 'href=', $pingback_link_offset);
     777                        $pingback_href_start = $pingback_href_pos+6;
     778                        $pingback_href_end = @strpos($contents, $quote, $pingback_href_start);
     779                        $pingback_server_url_len = $pingback_href_end - $pingback_href_start;
     780                        $pingback_server_url = substr($contents, $pingback_href_start, $pingback_server_url_len);
     781                        // We may find rel="pingback" but an incomplete pingback URI
     782                        if ($pingback_server_url_len > 0) {
     783                                // We got it!
     784                                return $pingback_server_url;
     785                        }
     786                }
     787                $byte_count += strlen($line);
     788                if ($byte_count > $timeout_bytes) {
     789                        // It's no use going further, there probably isn't any pingback
     790                        // server to find in this file. (Prevents loading large files.)
     791                        return false;
     792                }
     793        }
     794
     795        // We didn't find anything.
     796        return false;
     797}
     798
    780799
    781800/* wp_set_comment_status:
Note: See TracChangeset for help on using the changeset viewer.