WordPress.org

Make WordPress Core

Changeset 9309


Ignore:
Timestamp:
10/23/2008 10:42:59 PM (12 years ago)
Author:
ryan
Message:

Snoopy cleanup

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/2.6/wp-includes/class-snoopy.php

    r9304 r9309  
    11<?php
    2 
     2if ( !in_array('Snoopy', get_declared_classes() ) ) :
    33/*************************************************
    44
     
    3333{
    3434    /**** Public variables ****/
    35    
     35
    3636    /* user definable vars */
    3737
     
    4242    var $proxy_user     =   "";                 // proxy user to use
    4343    var $proxy_pass     =   "";                 // proxy password to use
    44    
     44
    4545    var $agent          =   "Snoopy v1.2.4";    // agent we masquerade as
    4646    var $referer        =   "";                 // referer info to pass
     
    6060                                                // NOTE: this currently does not respect
    6161                                                // dates, domains or paths.
    62    
     62
    6363    var $user           =   "";                 // user for http authentication
    6464    var $pass           =   "";                 // password for http authentication
    65    
     65
    6666    // http accept types
    6767    var $accept         =   "image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*";
    68    
     68
    6969    var $results        =   "";                 // where the content is put
    70        
     70
    7171    var $error          =   "";                 // error messages sent here
    7272    var $response_code  =   "";                 // response code returned from server
     
    9494                                                // as these functions are not stable
    9595                                                // as of this Snoopy release.
    96    
    97     /**** Private variables ****/   
    98    
     96
     97    /**** Private variables ****/
     98
    9999    var $_maxlinelen    =   4096;               // max line length (headers)
    100    
     100
    101101    var $_httpmethod    =   "GET";              // default http request method
    102102    var $_httpversion   =   "HTTP/1.0";         // default http request version
     
    108108    var $_frameurls     =   array();            // frame src urls
    109109    var $_framedepth    =   0;                  // increments on frame depth
    110    
     110
    111111    var $_isproxy       =   false;              // set if using a proxy server
    112112    var $_fp_timeout    =   30;                 // timeout for socket connection
     
    123123    function fetch($URI)
    124124    {
    125    
     125
    126126        //preg_match("|^([^:]+)://([^:/]+)(:[\d]+)*(.*)|",$URI,$URI_PARTS);
    127127        $URI_PARTS = parse_url($URI);
     
    134134        if (empty($URI_PARTS["path"]))
    135135            $URI_PARTS["path"] = '';
    136                
     136
    137137        switch(strtolower($URI_PARTS["scheme"]))
    138138        {
     
    154154                        $this->_httprequest($path, $fp, $URI, $this->_httpmethod);
    155155                    }
    156                    
     156
    157157                    $this->_disconnect($fp);
    158158
     
    177177                        $frameurls = $this->_frameurls;
    178178                        $this->_frameurls = array();
    179                        
     179
    180180                        while(list(,$frameurl) = each($frameurls))
    181181                        {
     
    188188                                break;
    189189                        }
    190                     }                   
     190                    }
    191191                }
    192192                else
     
    194194                    return false;
    195195                }
    196                 return true;                   
     196                return true;
    197197                break;
    198198            case "https":
     
    248248                            break;
    249249                    }
    250                 }                   
    251                 return true;                   
     250                }
     251                return true;
    252252                break;
    253253            default:
     
    256256                return false;
    257257                break;
    258         }       
     258        }
    259259        return true;
    260260    }
     
    274274    {
    275275        unset($postdata);
    276        
     276
    277277        $postdata = $this->_prepare_post_body($formvars, $formfiles);
    278            
     278
    279279        $URI_PARTS = parse_url($URI);
    280280        if (!empty($URI_PARTS["user"]))
     
    306306                        $this->_httprequest($path, $fp, $URI, $this->_submit_method, $this->_submit_type, $postdata);
    307307                    }
    308                    
     308
    309309                    $this->_disconnect($fp);
    310310
     
    313313                        /* url was redirected, check if we've hit the max depth */
    314314                        if($this->maxredirs > $this->_redirectdepth)
    315                         {                       
     315                        {
    316316                            if(!preg_match("|^".$URI_PARTS["scheme"]."://|", $this->_redirectaddr))
    317                                 $this->_redirectaddr = $this->_expandlinks($this->_redirectaddr,$URI_PARTS["scheme"]."://".$URI_PARTS["host"]);                     
    318                            
     317                                $this->_redirectaddr = $this->_expandlinks($this->_redirectaddr,$URI_PARTS["scheme"]."://".$URI_PARTS["host"]);
     318
    319319                            // only follow redirect if it's on this site, or offsiteok is true
    320320                            if(preg_match("|^http://".preg_quote($this->host)."|i",$this->_redirectaddr) || $this->offsiteok)
     
    335335                        $frameurls = $this->_frameurls;
    336336                        $this->_frameurls = array();
    337                        
     337
    338338                        while(list(,$frameurl) = each($frameurls))
    339                         {                                                       
     339                        {
    340340                            if($this->_framedepth < $this->maxframes)
    341341                            {
     
    346346                                break;
    347347                        }
    348                     }                   
    349                    
     348                    }
     349
    350350                }
    351351                else
     
    353353                    return false;
    354354                }
    355                 return true;                   
     355                return true;
    356356                break;
    357357            case "https":
     
    380380                    /* url was redirected, check if we've hit the max depth */
    381381                    if($this->maxredirs > $this->_redirectdepth)
    382                     {                       
     382                    {
    383383                        if(!preg_match("|^".$URI_PARTS["scheme"]."://|", $this->_redirectaddr))
    384                             $this->_redirectaddr = $this->_expandlinks($this->_redirectaddr,$URI_PARTS["scheme"]."://".$URI_PARTS["host"]);                     
     384                            $this->_redirectaddr = $this->_expandlinks($this->_redirectaddr,$URI_PARTS["scheme"]."://".$URI_PARTS["host"]);
    385385
    386386                        // only follow redirect if it's on this site, or offsiteok is true
     
    404404
    405405                    while(list(,$frameurl) = each($frameurls))
    406                     {                                                       
     406                    {
    407407                        if($this->_framedepth < $this->maxframes)
    408408                        {
     
    413413                            break;
    414414                    }
    415                 }                   
    416                 return true;                   
     415                }
     416                return true;
    417417                break;
    418                
     418
    419419            default:
    420420                // not a valid protocol
     
    422422                return false;
    423423                break;
    424         }       
     424        }
    425425        return true;
    426426    }
     
    436436    {
    437437        if ($this->fetch($URI))
    438         {           
     438        {
    439439            if($this->lastredirectaddr)
    440440                $URI = $this->lastredirectaddr;
     
    464464    function fetchform($URI)
    465465    {
    466        
     466
    467467        if ($this->fetch($URI))
    468         {           
     468        {
    469469
    470470            if(is_array($this->results))
     
    475475            else
    476476                $this->results = $this->_stripform($this->results);
    477            
     477
    478478            return true;
    479479        }
     
    481481            return false;
    482482    }
    483    
    484    
     483
     484
    485485/*======================================================================*\
    486486    Function:   fetchtext
     
    493493    {
    494494        if($this->fetch($URI))
    495         {           
     495        {
    496496            if(is_array($this->results))
    497497            {
     
    517517    {
    518518        if($this->submit($URI,$formvars, $formfiles))
    519         {           
     519        {
    520520            if($this->lastredirectaddr)
    521521                $URI = $this->lastredirectaddr;
     
    551551    {
    552552        if($this->submit($URI,$formvars, $formfiles))
    553         {           
     553        {
    554554            if($this->lastredirectaddr)
    555555                $URI = $this->lastredirectaddr;
     
    575575    }
    576576
    577    
     577
    578578
    579579/*======================================================================*\
     
    587587    }
    588588
    589    
     589
    590590/*======================================================================*\
    591591    Function:   set_submit_normal
     
    598598    }
    599599
    600    
    601    
     600
     601
    602602
    603603/*======================================================================*\
    604604    Private functions
    605605\*======================================================================*/
    606    
    607    
     606
     607
    608608/*======================================================================*\
    609609    Function:   _striplinks
     
    614614
    615615    function _striplinks($document)
    616     {   
     616    {
    617617        preg_match_all("'<\s*a\s.*?href\s*=\s*          # find <a href=
    618618                        ([\"\'])?                   # find single or double quote
     
    620620                                                    # quote, otherwise match up to next space
    621621                        'isx",$document,$links);
    622                        
     622
    623623
    624624        // catenate the non-empty matches from the conditional subpattern
     
    628628            if(!empty($val))
    629629                $match[] = $val;
    630         }               
    631        
     630        }
     631
    632632        while(list($key,$val) = each($links[3]))
    633633        {
    634634            if(!empty($val))
    635635                $match[] = $val;
    636         }       
    637        
     636        }
     637
    638638        // return the links
    639639        return $match;
     
    648648
    649649    function _stripform($document)
    650     {   
     650    {
    651651        preg_match_all("'<\/?(FORM|INPUT|SELECT|TEXTAREA|(OPTION))[^<>]*>(?(2)(.*(?=<\/?(option|select)[^<>]*>[\r\n]*)|(?=[\r\n]*))|(?=[\r\n]*))'Usi",$document,$elements);
    652        
     652
    653653        // catenate the matches
    654654        $match = implode("\r\n",$elements[0]);
    655                
     655
    656656        // return the links
    657657        return $match;
    658658    }
    659659
    660    
    661    
     660
     661
    662662/*======================================================================*\
    663663    Function:   _striptext
     
    669669    function _striptext($document)
    670670    {
    671        
     671
    672672        // I didn't use preg eval (//e) since that is only available in PHP 4.0.
    673673        // so, list your entities one by one here. I included some of the
    674674        // more common ones.
    675                                
     675
    676676        $search = array("'<script[^>]*?>.*?</script>'si",   // strip out javascript
    677677                        "'<[\/\!]*?[^<>]*?>'si",            // strip out html tags
     
    722722                            "ß",
    723723                        );
    724                    
     724
    725725        $text = preg_replace($search,$replace,$document);
    726                                
     726
    727727        return $text;
    728728    }
     
    738738    function _expandlinks($links,$URI)
    739739    {
    740        
     740
    741741        preg_match("/^[^\?]+/",$URI,$match);
    742742
     
    746746        $match_root =
    747747        $match_part["scheme"]."://".$match_part["host"];
    748                
     748
    749749        $search = array(    "|^http://".preg_quote($this->host)."|i",
    750750                            "|^(\/)|i",
     
    753753                            "|/[^\/]+/\.\./|"
    754754                        );
    755                        
     755
    756756        $replace = array(   "",
    757757                            $match_root."/",
     
    759759                            "/",
    760760                            "/"
    761                         );         
    762                
     761                        );
     762
    763763        $expandedLinks = preg_replace($search,$replace,$links);
    764764
     
    773773                $URI        the full URI
    774774                $body       body contents to send if any (POST)
    775     Output:     
    776 \*======================================================================*/
    777    
     775    Output:
     776\*======================================================================*/
     777
    778778    function _httprequest($url,$fp,$URI,$http_method,$content_type="",$body="")
    779779    {
     
    781781        if($this->passcookies && $this->_redirectaddr)
    782782            $this->setcookies();
    783            
     783
    784784        $URI_PARTS = parse_url($URI);
    785785        if(empty($url))
    786786            $url = "/";
    787         $headers = $http_method." ".$url." ".$this->_httpversion."\r\n";       
     787        $headers = $http_method." ".$url." ".$this->_httpversion."\r\n";
    788788        if(!empty($this->agent))
    789789            $headers .= "User-Agent: ".$this->agent."\r\n";
    790790        if(!empty($this->host) && !isset($this->rawheaders['Host'])) {
    791791            $headers .= "Host: ".$this->host;
    792             if(!empty($this->port))
     792            if(!empty($this->port) && $this->port != 80)
    793793                $headers .= ":".$this->port;
    794794            $headers .= "\r\n";
     
    799799            $headers .= "Referer: ".$this->referer."\r\n";
    800800        if(!empty($this->cookies))
    801         {           
     801        {
    802802            if(!is_array($this->cookies))
    803803                $this->cookies = (array)$this->cookies;
    804    
     804
    805805            reset($this->cookies);
    806806            if ( count($this->cookies) > 0 ) {
     
    810810                }
    811811                $headers .= substr($cookie_headers,0,-2) . "\r\n";
    812             } 
     812            }
    813813        }
    814814        if(!empty($this->rawheaders))
     
    825825            $headers .= "\r\n";
    826826        }
    827         if(!empty($body))   
     827        if(!empty($body))
    828828            $headers .= "Content-length: ".strlen($body)."\r\n";
    829         if(!empty($this->user) || !empty($this->pass)) 
     829        if(!empty($this->user) || !empty($this->pass))
    830830            $headers .= "Authorization: Basic ".base64_encode($this->user.":".$this->pass)."\r\n";
    831        
     831
    832832        //add proxy auth headers
    833         if(!empty($this->proxy_user))   
     833        if(!empty($this->proxy_user))
    834834            $headers .= 'Proxy-Authorization: ' . 'Basic ' . base64_encode($this->proxy_user . ':' . $this->proxy_pass)."\r\n";
    835835
    836836
    837837        $headers .= "\r\n";
    838        
     838
    839839        // set the read timeout if needed
    840840        if ($this->read_timeout > 0)
    841841            socket_set_timeout($fp, $this->read_timeout);
    842842        $this->timed_out = false;
    843        
     843
    844844        fwrite($fp,$headers.$body,strlen($headers.$body));
    845        
     845
    846846        $this->_redirectaddr = false;
    847847        unset($this->headers);
    848                        
     848
    849849        while($currentHeader = fgets($fp,$this->_maxlinelen))
    850850        {
     
    854854                return false;
    855855            }
    856                
     856
    857857            if($currentHeader == "\r\n")
    858858                break;
    859                        
     859
    860860            // if a header begins with Location: or URI:, set the redirect
    861861            if(preg_match("/^(Location:|URI:)/i",$currentHeader))
     
    877877                    $this->_redirectaddr = $matches[2];
    878878            }
    879        
     879
    880880            if(preg_match("|^HTTP/|",$currentHeader))
    881881            {
     
    883883                {
    884884                    $this->status= $status[1];
    885                 }               
     885                }
    886886                $this->response_code = $currentHeader;
    887887            }
    888                
     888
    889889            $this->headers[] = $currentHeader;
    890890        }
     
    904904            return false;
    905905        }
    906        
     906
    907907        // check if there is a a redirect meta tag
    908        
     908
    909909        if(preg_match("'<meta[\s]*http-equiv[^>]*?content[\s]*=[\s]*[\"\']?\d+;[\s]*URL[\s]*=[\s]*([^\"\']*?)[\"\']?>'i",$results,$match))
    910910
    911911        {
    912             $this->_redirectaddr = $this->_expandlinks($match[1],$URI); 
     912            $this->_redirectaddr = $this->_expandlinks($match[1],$URI);
    913913        }
    914914
     
    926926        else
    927927            $this->results = $results;
    928        
     928
    929929        return true;
    930930    }
     
    936936                $URI        the full URI
    937937                $body       body contents to send if any (POST)
    938     Output:     
    939 \*======================================================================*/
    940    
     938    Output:
     939\*======================================================================*/
     940
    941941    function _httpsrequest($url,$URI,$http_method,$content_type="",$body="")
    942     { 
     942    {
    943943        if($this->passcookies && $this->_redirectaddr)
    944944            $this->setcookies();
    945945
    946         $headers = array();     
    947                    
     946        $headers = array();
     947
    948948        $URI_PARTS = parse_url($URI);
    949949        if(empty($url))
    950950            $url = "/";
    951951        // GET ... header not needed for curl
    952         //$headers[] = $http_method." ".$url." ".$this->_httpversion;       
     952        //$headers[] = $http_method." ".$url." ".$this->_httpversion;
    953953        if(!empty($this->agent))
    954954            $headers[] = "User-Agent: ".$this->agent;
     
    963963            $headers[] = "Referer: ".$this->referer;
    964964        if(!empty($this->cookies))
    965         {           
     965        {
    966966            if(!is_array($this->cookies))
    967967                $this->cookies = (array)$this->cookies;
    968    
     968
    969969            reset($this->cookies);
    970970            if ( count($this->cookies) > 0 ) {
     
    989989                $headers[] = "Content-type: $content_type";
    990990        }
    991         if(!empty($body))   
     991        if(!empty($body))
    992992            $headers[] = "Content-length: ".strlen($body);
    993         if(!empty($this->user) || !empty($this->pass)) 
     993        if(!empty($this->user) || !empty($this->pass))
    994994            $headers[] = "Authorization: BASIC ".base64_encode($this->user.":".$this->pass);
    995            
     995
    996996        for($curr_header = 0; $curr_header < count($headers); $curr_header++) {
    997997            $safer_header = strtr( $headers[$curr_header], "\"", " " );
    998998            $cmdline_params .= " -H \"".$safer_header."\"";
    999999        }
    1000        
     1000
    10011001        if(!empty($body))
    10021002            $cmdline_params .= " -d \"$body\"";
    1003        
     1003
    10041004        if($this->read_timeout > 0)
    10051005            $cmdline_params .= " -m ".$this->read_timeout;
    1006        
     1006
    10071007        $headerfile = tempnam($temp_dir, "sno");
    10081008
    10091009        exec($this->curl_path." -k -D \"$headerfile\"".$cmdline_params." \"".escapeshellcmd($URI)."\"",$results,$return);
    1010        
     1010
    10111011        if($return)
    10121012        {
     
    10141014            return false;
    10151015        }
    1016            
    1017            
     1016
     1017
    10181018        $results = implode("\r\n",$results);
    1019        
     1019
    10201020        $result_headers = file("$headerfile");
    1021                        
     1021
    10221022        $this->_redirectaddr = false;
    10231023        unset($this->headers);
    1024                        
     1024
    10251025        for($currentHeader = 0; $currentHeader < count($result_headers); $currentHeader++)
    10261026        {
    1027            
     1027
    10281028            // if a header begins with Location: or URI:, set the redirect
    10291029            if(preg_match("/^(Location: |URI: )/i",$result_headers[$currentHeader]))
     
    10451045                    $this->_redirectaddr = $matches[2];
    10461046            }
    1047        
     1047
    10481048            if(preg_match("|^HTTP/|",$result_headers[$currentHeader]))
    10491049                $this->response_code = $result_headers[$currentHeader];
     
    10531053
    10541054        // check if there is a a redirect meta tag
    1055        
     1055
    10561056        if(preg_match("'<meta[\s]*http-equiv[^>]*?content[\s]*=[\s]*[\"\']?\d+;[\s]*URL[\s]*=[\s]*([^\"\']*?)[\"\']?>'i",$results,$match))
    10571057        {
    1058             $this->_redirectaddr = $this->_expandlinks($match[1],$URI); 
     1058            $this->_redirectaddr = $this->_expandlinks($match[1],$URI);
    10591059        }
    10601060
     
    10741074
    10751075        unlink("$headerfile");
    1076        
     1076
    10771077        return true;
    10781078    }
     
    10821082    Purpose:    set cookies for a redirection
    10831083\*======================================================================*/
    1084    
     1084
    10851085    function setcookies()
    10861086    {
     
    10921092    }
    10931093
    1094    
     1094
    10951095/*======================================================================*\
    10961096    Function:   _check_timeout
     
    11161116    Input:      $fp file pointer
    11171117\*======================================================================*/
    1118    
     1118
    11191119    function _connect(&$fp)
    11201120    {
     
    11221122            {
    11231123                $this->_isproxy = true;
    1124                
     1124
    11251125                $host = $this->proxy_host;
    11261126                $port = $this->proxy_port;
     
    11311131            $port = $this->port;
    11321132        }
    1133    
     1133
    11341134        $this->status = 0;
    1135        
     1135
    11361136        if($fp = fsockopen(
    11371137                    $host,
     
    11691169    Input:      $fp file pointer
    11701170\*======================================================================*/
    1171    
     1171
    11721172    function _disconnect($fp)
    11731173    {
     
    11751175    }
    11761176
    1177    
     1177
    11781178/*======================================================================*\
    11791179    Function:   _prepare_post_body
     
    11831183    Output:     post body
    11841184\*======================================================================*/
    1185    
     1185
    11861186    function _prepare_post_body($formvars, $formfiles)
    11871187    {
     
    11921192        if (count($formvars) == 0 && count($formfiles) == 0)
    11931193            return;
    1194        
     1194
    11951195        switch ($this->_submit_type) {
    11961196            case "application/x-www-form-urlencoded":
     
    12081208            case "multipart/form-data":
    12091209                $this->_mime_boundary = "Snoopy".md5(uniqid(microtime()));
    1210                
     1210
    12111211                reset($formvars);
    12121212                while(list($key,$val) = each($formvars)) {
     
    12231223                    }
    12241224                }
    1225                
     1225
    12261226                reset($formfiles);
    12271227                while (list($field_name, $file_names) = each($formfiles)) {
     
    12471247    }
    12481248}
    1249 
     1249endif;
    12501250?>
Note: See TracChangeset for help on using the changeset viewer.