/**
  * Calculates the absolute URL of a redirect
  *  
  * @param    object  Net_Url object containing the request URL
  * @param    string  Value of the 'Location' response header
  * @return   string|null  Absolute URL we are being redirected to, null in case of non-HTTP URL 
  * @access   private
  */
 function _redirectUrl($url, $location)
 {
     // If it begins with a scheme (as defined in RFC 2396) then it is absolute URI
     if (preg_match('/^([a-zA-Z][a-zA-Z0-9+.-]*):/', $location, $matches)) {
         // Bug #5759: we shouldn't try to follow non-HTTP redirects
         if ('http' == strtolower($matches[1]) || 'https' == strtolower($matches[1])) {
             return $location;
         } else {
             return null;
         }
     } else {
         if ('/' == $location[0]) {
             $url->path = Net_URL::resolvePath($location);
         } elseif ('/' == substr($url->path, -1)) {
             $url->path = Net_URL::resolvePath($url->path . $location);
         } else {
             $dirname = DIRECTORY_SEPARATOR == dirname($url->path) ? '/' : dirname($url->path);
             $url->path = Net_URL::resolvePath($dirname . '/' . $location);
         }
         $url->querystring = array();
         $url->anchor = '';
         return $url->getUrl();
     }
 }
Esempio n. 2
0
 /**
  * Sends the request
  *
  * @access public
  * @param  bool   Whether to store response body in Response object property,
  *                set this to false if downloading a LARGE file and using a Listener
  * @return mixed  PEAR error on error, true otherwise
  */
 function sendRequest($saveBody = true)
 {
     if (!is_a($this->_url, 'Net_URL')) {
         return PEAR::raiseError('No URL given.');
     }
     $host = isset($this->_proxy_host) ? $this->_proxy_host : $this->_url->host;
     $port = isset($this->_proxy_port) ? $this->_proxy_port : $this->_url->port;
     // 4.3.0 supports SSL connections using OpenSSL. The function test determines
     // we running on at least 4.3.0
     if (strcasecmp($this->_url->protocol, 'https') == 0 and function_exists('file_get_contents') and extension_loaded('openssl')) {
         if (isset($this->_proxy_host)) {
             return PEAR::raiseError('HTTPS proxies are not supported.');
         }
         $host = 'ssl://' . $host;
     }
     // magic quotes may f**k up file uploads and chunked response processing
     $magicQuotes = ini_get('magic_quotes_runtime');
     ini_set('magic_quotes_runtime', false);
     // If this is a second request, we may get away without
     // re-connecting if they're on the same server
     $err = $this->_sock->connect($host, $port, null, $this->_timeout, $this->_socketOptions);
     PEAR::isError($err) or $err = $this->_sock->write($this->_buildRequest());
     if (!PEAR::isError($err)) {
         if (!empty($this->_readTimeout)) {
             $this->_sock->setTimeout($this->_readTimeout[0], $this->_readTimeout[1]);
         }
         $this->_notify('sentRequest');
         // Read the response
         $this->_response =& new HTTP_Response($this->_sock, $this->_listeners);
         $err = $this->_response->process($this->_saveBody && $saveBody);
     }
     ini_set('magic_quotes_runtime', $magicQuotes);
     if (PEAR::isError($err)) {
         return $err;
     }
     // Check for redirection
     if ($this->_allowRedirects and $this->_redirects <= $this->_maxRedirects and $this->getResponseCode() > 300 and $this->getResponseCode() < 399 and !empty($this->_response->_headers['location'])) {
         $redirect = $this->_response->_headers['location'];
         // Absolute URL
         if (preg_match('/^https?:\\/\\//i', $redirect)) {
             $this->_url =& new Net_URL($redirect);
             $this->addHeader('Host', $this->_generateHostHeader());
             // Absolute path
         } elseif ($redirect[0] == '/') {
             $this->_url->path = $redirect;
             // Relative path
         } elseif (substr($redirect, 0, 3) == '../' or substr($redirect, 0, 2) == './') {
             if (substr($this->_url->path, -1) == '/') {
                 $redirect = $this->_url->path . $redirect;
             } else {
                 $redirect = dirname($this->_url->path) . '/' . $redirect;
             }
             $redirect = Net_URL::resolvePath($redirect);
             $this->_url->path = $redirect;
             // Filename, no path
         } else {
             if (substr($this->_url->path, -1) == '/') {
                 $redirect = $this->_url->path . $redirect;
             } else {
                 $redirect = dirname($this->_url->path) . '/' . $redirect;
             }
             $this->_url->path = $redirect;
         }
         $this->_redirects++;
         return $this->sendRequest($saveBody);
         // Too many redirects
     } elseif ($this->_allowRedirects and $this->_redirects > $this->_maxRedirects) {
         return PEAR::raiseError('Too many redirects');
     }
     $this->_sock->disconnect();
     return true;
 }
Esempio n. 3
0
 function convertPath($in_to, $path)
 {
     // it's a // url (eg. use https if already in https mode...)
     if (preg_match('#^//#', $path)) {
         return $path;
     }
     //print_r(array($this->baseURL, $in_to, $path ));
     require_once 'Net/URL.php';
     $a = new Net_URL();
     $path = $a->resolvePath($this->baseURL . '/' . $path);
     // not sure if that's a good idea..
     $to = rtrim($a->resolvePath($in_to), '/');
     //print_r(array($path,$to));
     $path1 = $path ? explode('/', $path) : array();
     $path2 = $to ? explode('/', $to) : array();
     $shared = array();
     // compare paths & strip identical ancestors
     foreach ($path1 as $i => $chunk) {
         if (isset($path2[$i]) && $path1[$i] == $path2[$i]) {
             $shared[] = $chunk;
         } else {
             break;
         }
     }
     $shared = implode('/', $shared);
     //print_r(array($shared));
     $path = mb_substr($path, mb_strlen($shared));
     $to = mb_substr($to, mb_strlen($shared));
     $to = str_repeat('../', mb_substr_count($to, '/'));
     $ret = $to . ltrim($path, '/');
     //print_r(array($ret));
     return $ret;
 }
Esempio n. 4
0
 public function generate($values = array(), $qstring = array(), $anchor = '')
 {
     $path = '';
     foreach ($this->parts as $part) {
         $path .= $part->generate($values);
     }
     $path = '/' . trim(Net_URL::resolvePath($path), '/');
     if (!empty($qstring)) {
         $path .= '?' . http_build_query($qstring);
     }
     if (!empty($anchor)) {
         $path .= '#' . ltrim($anchor, '#');
     }
     return $path;
 }
Esempio n. 5
0
    /**
    * Sends the request
    *
    * @access public
    * @param  bool   Whether to store response body in Response object property,
    *                set this to false if downloading a LARGE file and using a Listener
    * @return mixed  PEAR error on error, true otherwise
    */
    function sendRequest($saveBody = true)
    {
        if (!is_a($this->_url, 'Net_URL')) {
            return PEAR::raiseError('No URL given', HTTP_REQUEST_ERROR_URL);
        }

        $host = isset($this->_proxy_host) ? $this->_proxy_host : $this->_url->host;
        $port = isset($this->_proxy_port) ? $this->_proxy_port : $this->_url->port;

        // 4.3.0 supports SSL connections using OpenSSL. The function test determines
        // we running on at least 4.3.0
        if (strcasecmp($this->_url->protocol, 'https') == 0 AND function_exists('file_get_contents') AND extension_loaded('openssl')) {
            if (isset($this->_proxy_host)) {
                return PEAR::raiseError('HTTPS proxies are not supported', HTTP_REQUEST_ERROR_PROXY);
            }
            $host = 'ssl://' . $host;
        }

        // magic quotes may f**k up file uploads and chunked response processing
        $magicQuotes = ini_get('magic_quotes_runtime');
        ini_set('magic_quotes_runtime', false);

        // RFC 2068, section 19.7.1: A client MUST NOT send the Keep-Alive 
        // connection token to a proxy server...
        if (isset($this->_proxy_host) && !empty($this->_requestHeaders['connection']) &&
            'Keep-Alive' == $this->_requestHeaders['connection'])
        {
            $this->removeHeader('connection');
        }

        $keepAlive = (HTTP_REQUEST_HTTP_VER_1_1 == $this->_http && empty($this->_requestHeaders['connection'])) ||
                     (!empty($this->_requestHeaders['connection']) && 'Keep-Alive' == $this->_requestHeaders['connection']);
        $sockets   = &PEAR::getStaticProperty('HTTP_Request', 'sockets');
        $sockKey   = $host . ':' . $port;
        unset($this->_sock);

        // There is a connected socket in the "static" property?
        if ($keepAlive && !empty($sockets[$sockKey]) &&
            !empty($sockets[$sockKey]->fp)) 
        {
            $this->_sock =& $sockets[$sockKey];
            $err = null;
        } else {
            $this->_notify('connect');
            $this->_sock = new Net_Socket();
            $err = $this->_sock->connect($host, $port, null, $this->_timeout, $this->_socketOptions);
        }
        PEAR::isError($err) or $err = $this->_sock->write($this->_buildRequest());

        if (!PEAR::isError($err)) {
            if (!empty($this->_readTimeout)) {
                $this->_sock->setTimeout($this->_readTimeout[0], $this->_readTimeout[1]);
            }

            $this->_notify('sentRequest');

            // Read the response
            $this->_response = new HTTP_Response($this->_sock, $this->_listeners);
            $err = $this->_response->process(
                $this->_saveBody && $saveBody,
                HTTP_REQUEST_METHOD_HEAD != $this->_method
            );

            if ($keepAlive) {
                $keepAlive = (isset($this->_response->_headers['content-length'])
                              || (isset($this->_response->_headers['transfer-encoding'])
                                  && strtolower($this->_response->_headers['transfer-encoding']) == 'chunked'));
                if ($keepAlive) {
                    if (isset($this->_response->_headers['connection'])) {
                        $keepAlive = strtolower($this->_response->_headers['connection']) == 'keep-alive';
                    } else {
                        $keepAlive = 'HTTP/'.HTTP_REQUEST_HTTP_VER_1_1 == $this->_response->_protocol;
                    }
                }
            }
        }

        ini_set('magic_quotes_runtime', $magicQuotes);

        if (PEAR::isError($err)) {
            return $err;
        }

        if (!$keepAlive) {
            $this->disconnect();
        // Store the connected socket in "static" property
        } elseif (empty($sockets[$sockKey]) || empty($sockets[$sockKey]->fp)) {
            $sockets[$sockKey] =& $this->_sock;
        }

        // Check for redirection
        if (    $this->_allowRedirects
            AND $this->_redirects <= $this->_maxRedirects
            AND $this->getResponseCode() > 300
            AND $this->getResponseCode() < 399
            AND !empty($this->_response->_headers['location'])) {

            
            $redirect = $this->_response->_headers['location'];

            // Absolute URL
            if (preg_match('/^https?:\/\//i', $redirect)) {
                $this->_url = new Net_URL($redirect);
                $this->addHeader('Host', $this->_generateHostHeader());
            // Absolute path
            } elseif ($redirect{0} == '/') {
                $this->_url->path = $redirect;
            
            // Relative path
            } elseif (substr($redirect, 0, 3) == '../' OR substr($redirect, 0, 2) == './') {
                if (substr($this->_url->path, -1) == '/') {
                    $redirect = $this->_url->path . $redirect;
                } else {
                    $redirect = dirname($this->_url->path) . '/' . $redirect;
                }
                $redirect = Net_URL::resolvePath($redirect);
                $this->_url->path = $redirect;
                
            // Filename, no path
            } else {
                if (substr($this->_url->path, -1) == '/') {
                    $redirect = $this->_url->path . $redirect;
                } else {
                    $redirect = dirname($this->_url->path) . '/' . $redirect;
                }
                $this->_url->path = $redirect;
            }

            $this->_redirects++;
            return $this->sendRequest($saveBody);

        // Too many redirects
        } elseif ($this->_allowRedirects AND $this->_redirects > $this->_maxRedirects) {
            return PEAR::raiseError('Too many redirects', HTTP_REQUEST_ERROR_REDIRECTS);
        }

        return true;
    }
 /**
  * Instantiate a new MP3_Playlist object.
  *
  * Expects a reading directory, the output directory where the playlist will
  * be saved and the directory or URL to be used within the playlist.
  *
  * @param   string $dir     The directory to scan
  * @param   string $outdir  The directory where to save the playlist file
  * @param   string $baseurl The base url to append on the playlist file
  * @param   bool   $debug   (optional) Whether print debug message or not, default FALSE
  *
  * @return  TRUE|PEAR_Error
  * @see     MP3_Playlist::fixPath()
  */
 public function __construct($dir, $outdir, $baseurl, $debug = false)
 {
     // Taking the values from the constructor and assigning it to the
     // private variables
     $this->parseDirectory = self::fixPath($dir);
     $this->outputDirectory = self::fixPath($outdir);
     // Fix the URL if needed.
     if (substr($baseurl, -1) != '/') {
         $baseurl .= '/';
     }
     $url = new Net_URL($baseurl);
     if (!empty($url->path)) {
         $dirs = explode('/', $url->path);
         foreach ($dirs as $key => $value) {
             if (!empty($value)) {
                 $dirs[$key] = rawurlencode($value);
             }
         }
         $url->path = Net_URL::resolvePath(implode('/', $dirs));
     }
     $this->baseUrl = $url->getURL();
     $this->list = array();
     // Instantiate the new MP3_If object
     $this->mp3 = new MP3_Id();
     $this->debug = $debug;
     $this->parse();
 }
Esempio n. 7
0
 /**
  * Calculates the absolute URL of a redirect
  *  
  * @param    object  Net_Url object containing the request URL
  * @param    string  Value of the 'Location' response header
  * @return   string  Absolute URL we are being redirected to
  * @access   private
  */
 function _redirectUrl($url, $location)
 {
     if (preg_match('!^https?://!i', $location)) {
         return $location;
     } else {
         if ('/' == $location[0]) {
             $url->path = Net_URL::resolvePath($location);
         } elseif ('/' == substr($url->path, -1)) {
             $url->path = Net_URL::resolvePath($url->path . $location);
         } else {
             $dirname = DIRECTORY_SEPARATOR == dirname($url->path) ? '/' : dirname($url->path);
             $url->path = Net_URL::resolvePath($dirname . '/' . $location);
         }
         $url->querystring = array();
         $url->anchor = '';
         return $url->getUrl();
     }
 }
Esempio n. 8
0
 /**
  * Sends the request
  *
  * @access public
  * @return mixed  PEAR error on error, true otherwise
  */
 function sendRequest()
 {
     $host = isset($this->_proxy_host) ? $this->_proxy_host : $this->_url->host;
     $port = isset($this->_proxy_port) ? $this->_proxy_port : $this->_url->port;
     // 4.3.0 supports SSL connections using OpenSSL. The function test determines
     // we running on at least 4.3.0
     if (strcasecmp($this->_url->protocol, 'https') == 0 and function_exists('file_get_contents') and extension_loaded('openssl')) {
         $host = 'ssl://' . $host;
     }
     // If this is a second request, we may get away without
     // re-connecting if they're on the same server
     if (PEAR::isError($err = $this->_sock->connect($host, $port, null, $this->_timeout)) or PEAR::isError($err = $this->_sock->write($this->_buildRequest()))) {
         return $err;
     }
     // Read the response
     if (PEAR::isError($err = $this->readResponse())) {
         return $err;
     }
     // Check for redirection
     if ($this->_allowRedirects and $this->_redirects <= $this->_maxRedirects and $this->getResponseCode() > 300 and $this->getResponseCode() < 399 and !empty($this->_response->_headers['Location'])) {
         $redirect = $this->_response->_headers['Location'];
         // Absolute URL
         if (preg_match('/^https?:\\/\\//i', $redirect)) {
             $this->_url =& new Net_URL($redirect);
             // Absolute path
         } elseif ($redirect[0] == '/') {
             $this->_url->path = $redirect;
             // Relative path
         } elseif (substr($redirect, 0, 3) == '../' or substr($redirect, 0, 2) == './') {
             if (substr($this->_url->path, -1) == '/') {
                 $redirect = $this->_url->path . $redirect;
             } else {
                 $redirect = dirname($this->_url->path) . '/' . $redirect;
             }
             $redirect = Net_URL::resolvePath($redirect);
             $this->_url->path = $redirect;
             // Filename, no path
         } else {
             if (substr($this->_url->path, -1) == '/') {
                 $redirect = $this->_url->path . $redirect;
             } else {
                 $redirect = dirname($this->_url->path) . '/' . $redirect;
             }
             $this->_url->path = $redirect;
         }
         $this->_redirects++;
         return $this->sendRequest();
         // Too many redirects
     } elseif ($this->_allowRedirects and $this->_redirects > $this->_maxRedirects) {
         return PEAR::raiseError('Too many redirects');
     }
     return true;
 }
 /**
  * @param  string  $url
  * @param  string  $base_url
  * @return string
  */
 private function getAbsoluteUrl($url, $base_url)
 {
     if (preg_match('/^[\\w\\+\\-\\.]+:/', $url) or false === ($bases = @parse_url($base_url))) {
         return $url;
     } elseif (0 === strpos($url, '/')) {
         return "{$bases['scheme']}://{$bases['host']}" . (isset($bases['port']) ? ":{$bases['port']}" : '') . $url;
     } else {
         if (!isset($bases['path'])) {
             $bases['path'] = '/';
         }
         return "{$bases['scheme']}://{$bases['host']}" . (isset($bases['port']) ? ":{$bases['port']}" : '') . Net_URL::resolvePath(substr($bases['path'], 0, strrpos($bases['path'], '/') + 1) . $url);
     }
 }
Esempio n. 10
0
 /**
  * Sends the request
  *
  * @access public
  * @param  bool   Whether to store response body in Response object property,
  *                set this to false if downloading a LARGE file and using a Listener
  * @return mixed  PEAR error on error, true otherwise
  */
 function sendRequest($saveBody = true)
 {
     if (!is_a($this->_url, 'Net_URL')) {
         return PEAR::raiseError('No URL given', HTTP_REQUEST_ERROR_URL);
     }
     $host = isset($this->_proxy_host) ? $this->_proxy_host : $this->_url->host;
     $port = isset($this->_proxy_port) ? $this->_proxy_port : $this->_url->port;
     if (strcasecmp($this->_url->protocol, 'https') == 0) {
         // Bug #14127, don't try connecting to HTTPS sites without OpenSSL
         if (version_compare(PHP_VERSION, '4.3.0', '<') || !extension_loaded('openssl')) {
             return PEAR::raiseError('Need PHP 4.3.0 or later with OpenSSL support for https:// requests', HTTP_REQUEST_ERROR_URL);
         } elseif (isset($this->_proxy_host)) {
             return PEAR::raiseError('HTTPS proxies are not supported', HTTP_REQUEST_ERROR_PROXY);
         }
         $host = 'ssl://' . $host;
     }
     // magic quotes may f**k up file uploads and chunked response processing
     $magicQuotes = ini_get('magic_quotes_runtime');
     ini_set('magic_quotes_runtime', false);
     // RFC 2068, section 19.7.1: A client MUST NOT send the Keep-Alive
     // connection token to a proxy server...
     if (isset($this->_proxy_host) && !empty($this->_requestHeaders['connection']) && 'Keep-Alive' == $this->_requestHeaders['connection']) {
         $this->removeHeader('connection');
     }
     $keepAlive = HTTP_REQUEST_HTTP_VER_1_1 == $this->_http && empty($this->_requestHeaders['connection']) || !empty($this->_requestHeaders['connection']) && 'Keep-Alive' == $this->_requestHeaders['connection'];
     $sockets =& PEAR::getStaticProperty('HTTP_Request', 'sockets');
     $sockKey = $host . ':' . $port;
     unset($this->_sock);
     // There is a connected socket in the "static" property?
     if ($keepAlive && !empty($sockets[$sockKey]) && !empty($sockets[$sockKey]->fp)) {
         $this->_sock =& $sockets[$sockKey];
         $err = null;
     } else {
         $this->_notify('connect');
         $this->_sock = new Net_Socket();
         $err = $this->_sock->connect($host, $port, null, $this->_timeout, $this->_socketOptions);
     }
     PEAR::isError($err) or $err = $this->_sock->write($this->_buildRequest());
     if (!PEAR::isError($err)) {
         if (!empty($this->_readTimeout)) {
             $this->_sock->setTimeout($this->_readTimeout[0], $this->_readTimeout[1]);
         }
         $this->_notify('sentRequest');
         // Read the response
         $this->_response = new HTTP_Response($this->_sock, $this->_listeners);
         $err = $this->_response->process($this->_saveBody && $saveBody, HTTP_REQUEST_METHOD_HEAD != $this->_method);
         if ($keepAlive) {
             $keepAlive = isset($this->_response->_headers['content-length']) || isset($this->_response->_headers['transfer-encoding']) && strtolower($this->_response->_headers['transfer-encoding']) == 'chunked';
             if ($keepAlive) {
                 if (isset($this->_response->_headers['connection'])) {
                     $keepAlive = strtolower($this->_response->_headers['connection']) == 'keep-alive';
                 } else {
                     $keepAlive = 'HTTP/' . HTTP_REQUEST_HTTP_VER_1_1 == $this->_response->_protocol;
                 }
             }
         }
     }
     ini_set('magic_quotes_runtime', $magicQuotes);
     if (PEAR::isError($err)) {
         return $err;
     }
     if (!$keepAlive) {
         $this->disconnect();
         // Store the connected socket in "static" property
     } elseif (empty($sockets[$sockKey]) || empty($sockets[$sockKey]->fp)) {
         $sockets[$sockKey] =& $this->_sock;
     }
     // Check for redirection
     if ($this->_allowRedirects and $this->_redirects <= $this->_maxRedirects and $this->getResponseCode() > 300 and $this->getResponseCode() < 399 and !empty($this->_response->_headers['location'])) {
         $redirect = $this->_response->_headers['location'];
         // Absolute URL
         if (preg_match('/^https?:\\/\\//i', $redirect)) {
             $this->_url = new Net_URL($redirect);
             $this->addHeader('Host', $this->_generateHostHeader());
             // Absolute path
         } elseif ($redirect[0] == '/') {
             $this->_url->path = $redirect;
             // Relative path
         } elseif (substr($redirect, 0, 3) == '../' or substr($redirect, 0, 2) == './') {
             if (substr($this->_url->path, -1) == '/') {
                 $redirect = $this->_url->path . $redirect;
             } else {
                 $redirect = dirname($this->_url->path) . '/' . $redirect;
             }
             $redirect = Net_URL::resolvePath($redirect);
             $this->_url->path = $redirect;
             // Filename, no path
         } else {
             if (substr($this->_url->path, -1) == '/') {
                 $redirect = $this->_url->path . $redirect;
             } else {
                 $redirect = dirname($this->_url->path) . '/' . $redirect;
             }
             $this->_url->path = $redirect;
         }
         // handle cookes on redirect...
         if (!empty($this->_response->_cookies)) {
             foreach ($this->_response->_cookies as $c) {
                 $this->_cookies[] = $c;
             }
         }
         if (isset($this->_requestHeaders['cookie'])) {
             unset($this->_requestHeaders['cookie']);
         }
         //print_r($this->_cookies);
         $cookies = array();
         foreach ($this->_cookies as $c) {
             if (substr($this->_url->host, -1 * strlen($c['domain']) == $c['domain'])) {
                 $cookies[$c['name']] = $c['value'];
             }
         }
         foreach ($cookies as $k => $v) {
             $this->addCookie($k, $v);
         }
         $this->_redirects++;
         return $this->sendRequest($saveBody);
         // Too many redirects
     } elseif ($this->_allowRedirects and $this->_redirects > $this->_maxRedirects) {
         return PEAR::raiseError('Too many redirects', HTTP_REQUEST_ERROR_REDIRECTS);
     }
     return true;
 }
Esempio n. 11
0
 /**
  * Sends the request
  *
  * @access public
  * @param  bool   Whether to store response body in Response object property,
  *                set this to false if downloading a LARGE file and using a Listener
  * @return mixed  PEAR error on error, true otherwise
  */
 function sendRequest($saveBody = true)
 {
     if (function_exists('is_a') && !is_a($this->_url, 'Net_URL')) {
         return PEAR::raiseError('No URL given.');
     }
     $host = isset($this->_proxy_host) ? $this->_proxy_host : $this->_url->host;
     $port = isset($this->_proxy_port) ? $this->_proxy_port : $this->_url->port;
     // 4.3.0 supports SSL connections using OpenSSL. The function test determines
     // we running on at least 4.3.0
     if (strcasecmp($this->_url->protocol, 'https') == 0 and function_exists('file_get_contents') and extension_loaded('openssl')) {
         if (isset($this->_proxy_host)) {
             return PEAR::raiseError('HTTPS proxies are not supported.');
         }
         $host = 'ssl://' . $host;
     }
     // If this is a second request, we may get away without
     // re-connecting if they're on the same server
     if (PEAR::isError($err = $this->_sock->connect($host, $port, null, $this->_timeout, $this->_socketOptions)) || PEAR::isError($err = $this->_sock->write($this->_buildRequest()))) {
         return $err;
     }
     if (!empty($this->_readTimeout)) {
         $this->_sock->setTimeout($this->_readTimeout[0], $this->_readTimeout[1]);
     }
     $this->_notify('sentRequest');
     // Read the response
     $this->_response =& new HTTP_Response($this->_sock, $this->_listeners);
     if (PEAR::isError($err = $this->_response->process($this->_saveBody && $saveBody))) {
         return $err;
     }
     // Check for redirection
     // Bugfix (PEAR) bug #18, 6 oct 2003 by Dave Mertens (headers are also stored lowercase, so we're gonna use them here)
     // some non RFC2616 compliant servers (scripts) are returning lowercase headers ('location: xxx')
     if ($this->_allowRedirects and $this->_redirects <= $this->_maxRedirects and $this->getResponseCode() > 300 and $this->getResponseCode() < 399 and !empty($this->_response->_headers['location'])) {
         $redirect = $this->_response->_headers['location'];
         // Absolute URL
         if (preg_match('/^https?:\\/\\//i', $redirect)) {
             $this->_url =& new Net_URL($redirect);
             $this->addHeader('Host', $this->_generateHostHeader());
             // Absolute path
         } elseif ($redirect[0] == '/') {
             $this->_url->path = $redirect;
             // Relative path
         } elseif (substr($redirect, 0, 3) == '../' or substr($redirect, 0, 2) == './') {
             if (substr($this->_url->path, -1) == '/') {
                 $redirect = $this->_url->path . $redirect;
             } else {
                 $redirect = dirname($this->_url->path) . '/' . $redirect;
             }
             $redirect = Net_URL::resolvePath($redirect);
             $this->_url->path = $redirect;
             // Filename, no path
         } else {
             if (substr($this->_url->path, -1) == '/') {
                 $redirect = $this->_url->path . $redirect;
             } else {
                 $redirect = dirname($this->_url->path) . '/' . $redirect;
             }
             $this->_url->path = $redirect;
         }
         $this->_redirects++;
         return $this->sendRequest($saveBody);
         // Too many redirects
     } elseif ($this->_allowRedirects and $this->_redirects > $this->_maxRedirects) {
         return PEAR::raiseError('Too many redirects');
     }
     $this->_sock->disconnect();
     return true;
 }
Esempio n. 12
0
 function sendRequest($saveBody = true)
 {
     if (!is_a($this->_url, 'Net_URL')) {
         trigger_error('No URL given.', E_USER_ERROR);
     }
     $host = isset($this->_proxy_host) ? $this->_proxy_host : $this->_url->host;
     $port = isset($this->_proxy_port) ? $this->_proxy_port : $this->_url->port;
     if (strcasecmp($this->_url->protocol, 'https') == 0 and function_exists('file_get_contents') and extension_loaded('openssl')) {
         if (isset($this->_proxy_host)) {
             trigger_error('HTTPS proxies are not supported.', E_USER_ERROR);
         }
         $host = 'ssl://' . $host;
     }
     $magicQuotes = ini_get('magic_quotes_runtime');
     ini_set('magic_quotes_runtime', false);
     $err = $this->_sock->connect($host, $port, null, $this->_timeout, $this->_socketOptions);
     $err = $this->_sock->write($this->_buildRequest());
     if (!empty($this->_readTimeout)) {
         $this->_sock->setTimeout($this->_readTimeout[0], $this->_readTimeout[1]);
     }
     $this->_notify('sentRequest');
     $this->_response =& new HTTP_Response($this->_sock, $this->_listeners);
     $err = $this->_response->process($this->_saveBody && $saveBody);
     ini_set('magic_quotes_runtime', $magicQuotes);
     if ($this->_allowRedirects and $this->_redirects <= $this->_maxRedirects and $this->getResponseCode() > 300 and $this->getResponseCode() < 399 and !empty($this->_response->_headers['location'])) {
         $redirect = $this->_response->_headers['location'];
         if (preg_match('/^https?:\\/\\//i', $redirect)) {
             $this->_url =& new Net_URL($redirect);
             $this->addHeader('Host', $this->_generateHostHeader());
         } elseif ($redirect[0] == '/') {
             $this->_url->path = $redirect;
         } elseif (substr($redirect, 0, 3) == '../' or substr($redirect, 0, 2) == './') {
             if (substr($this->_url->path, -1) == '/') {
                 $redirect = $this->_url->path . $redirect;
             } else {
                 $redirect = dirname($this->_url->path) . '/' . $redirect;
             }
             $redirect = Net_URL::resolvePath($redirect);
             $this->_url->path = $redirect;
         } else {
             if (substr($this->_url->path, -1) == '/') {
                 $redirect = $this->_url->path . $redirect;
             } else {
                 $redirect = dirname($this->_url->path) . '/' . $redirect;
             }
             $this->_url->path = $redirect;
         }
         $this->_redirects++;
         return $this->sendRequest($saveBody);
     } elseif ($this->_allowRedirects and $this->_redirects > $this->_maxRedirects) {
         trigger_error('Too many redirects', E_USER_ERROR);
     }
     $this->_sock->disconnect();
     return true;
 }