Changeset 1709

Show
Ignore:
Timestamp:
09/24/04 17:29:25 (4 years ago)
Author:
michelvaldrighi
Message:

added discover_pingback_server_uri, should dramatically speed things up

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • 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: