⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 yadis.php

📁 简介:IceBB是一个强大
💻 PHP
字号:
<?php/** * The core PHP Yadis implementation. * * PHP versions 4 and 5 * * LICENSE: See the COPYING file included in this distribution. * * @package OpenID * @author JanRain, Inc. <openid@janrain.com> * @copyright 2005 Janrain, Inc. * @license http://www.gnu.org/copyleft/lesser.html LGPL *//** * Need both fetcher types so we can use the right one based on the * presence or absence of CURL. */require_once "Auth/Yadis/PlainHTTPFetcher.php";require_once "Auth/Yadis/ParanoidHTTPFetcher.php";/** * Need this for parsing HTML (looking for META tags). */require_once "Auth/Yadis/ParseHTML.php";/** * Need this to parse the XRDS document during Yadis discovery. */require_once "Auth/Yadis/XRDS.php";/** * XRDS (yadis) content type */define('Auth_Yadis_CONTENT_TYPE', 'application/xrds+xml');/** * Yadis header */define('Auth_Yadis_HEADER_NAME', 'X-XRDS-Location');/** * Contains the result of performing Yadis discovery on a URI. * * @package OpenID */class Auth_Yadis_DiscoveryResult {    // The URI that was passed to the fetcher    var $request_uri = null;    // The result of following redirects from the request_uri    var $normalized_uri = null;    // The URI from which the response text was returned (set to    // None if there was no XRDS document found)    var $xrds_uri = null;    var $xrds = null;    // The content-type returned with the response_text    var $content_type = null;    // The document returned from the xrds_uri    var $response_text = null;    // Did the discovery fail miserably?    var $failed = false;    function Auth_Yadis_DiscoveryResult($request_uri)    {        // Initialize the state of the object        // sets all attributes to None except the request_uri        $this->request_uri = $request_uri;    }    function fail()    {        $this->failed = true;    }    function isFailure()    {        return $this->failed;    }    /**     * Returns the list of service objects as described by the XRDS     * document, if this yadis object represents a successful Yadis     * discovery.     *     * @return array $services An array of {@link Auth_Yadis_Service}     * objects     */    function services()    {        if ($this->xrds) {            return $this->xrds->services();        }        return null;    }    function usedYadisLocation()    {        // Was the Yadis protocol's indirection used?        return $this->normalized_uri == $this->xrds_uri;    }    function isXRDS()    {        // Is the response text supposed to be an XRDS document?        return ($this->usedYadisLocation() ||                $this->content_type == Auth_Yadis_CONTENT_TYPE);    }}/** * This is the core of the PHP Yadis library.  This is the only class * a user needs to use to perform Yadis discovery.  This class * performs the discovery AND stores the result of the discovery. * * First, require this library into your program source: * * <pre>  require_once "Auth/Yadis/Yadis.php";</pre> * * To perform Yadis discovery, first call the "discover" method * statically with a URI parameter: * * <pre>  $http_response = array(); *  $fetcher = Auth_Yadis_Yadis::getHTTPFetcher(); *  $yadis_object = Auth_Yadis_Yadis::discover($uri, *                                    $http_response, $fetcher);</pre> * * If the discovery succeeds, $yadis_object will be an instance of * {@link Auth_Yadis_Yadis}.  If not, it will be null.  The XRDS * document found during discovery should have service descriptions, * which can be accessed by calling * * <pre>  $service_list = $yadis_object->services();</pre> * * which returns an array of objects which describe each service. * These objects are instances of Auth_Yadis_Service.  Each object * describes exactly one whole Service element, complete with all of * its Types and URIs (no expansion is performed).  The common use * case for using the service objects returned by services() is to * write one or more filter functions and pass those to services(): * * <pre>  $service_list = $yadis_object->services( *                               array("filterByURI", *                                     "filterByExtension"));</pre> * * The filter functions (whose names appear in the array passed to * services()) take the following form: * * <pre>  function myFilter(&$service) { *       // Query $service object here.  Return true if the service *       // matches your query; false if not. *  }</pre> * * This is an example of a filter which uses a regular expression to * match the content of URI tags (note that the Auth_Yadis_Service * class provides a getURIs() method which you should use instead of * this contrived example): * * <pre> *  function URIMatcher(&$service) { *      foreach ($service->getElements('xrd:URI') as $uri) { *          if (preg_match("/some_pattern/", *                         $service->parser->content($uri))) { *              return true; *          } *      } *      return false; *  }</pre> * * The filter functions you pass will be called for each service * object to determine which ones match the criteria your filters * specify.  The default behavior is that if a given service object * matches ANY of the filters specified in the services() call, it * will be returned.  You can specify that a given service object will * be returned ONLY if it matches ALL specified filters by changing * the match mode of services(): * * <pre>  $yadis_object->services(array("filter1", "filter2"), *                          SERVICES_YADIS_MATCH_ALL);</pre> * * See {@link SERVICES_YADIS_MATCH_ALL} and {@link * SERVICES_YADIS_MATCH_ANY}. * * Services described in an XRDS should have a library which you'll * probably be using.  Those libraries are responsible for defining * filters that can be used with the "services()" call.  If you need * to write your own filter, see the documentation for {@link * Auth_Yadis_Service}. * * @package OpenID */class Auth_Yadis_Yadis {    /**     * Returns an HTTP fetcher object.  If the CURL extension is     * present, an instance of {@link Auth_Yadis_ParanoidHTTPFetcher}     * is returned.  If not, an instance of     * {@link Auth_Yadis_PlainHTTPFetcher} is returned.     *     * If Auth_Yadis_CURL_OVERRIDE is defined, this method will always     * return a {@link Auth_Yadis_PlainHTTPFetcher}.     */    function getHTTPFetcher($timeout = 20)    {        if (Auth_Yadis_Yadis::curlPresent() &&            (!defined('Auth_Yadis_CURL_OVERRIDE'))) {            $fetcher = new Auth_Yadis_ParanoidHTTPFetcher($timeout);        } else {            $fetcher = new Auth_Yadis_PlainHTTPFetcher($timeout);        }        return $fetcher;    }    function curlPresent()    {        return function_exists('curl_init');    }    /**     * @access private     */    function _getHeader($header_list, $names)    {        foreach ($header_list as $name => $value) {            foreach ($names as $n) {                if (strtolower($name) == strtolower($n)) {                    return $value;                }            }        }        return null;    }    /**     * @access private     */    function _getContentType($content_type_header)    {        if ($content_type_header) {            $parts = explode(";", $content_type_header);            return strtolower($parts[0]);        }    }    /**     * This should be called statically and will build a Yadis     * instance if the discovery process succeeds.  This implements     * Yadis discovery as specified in the Yadis specification.     *     * @param string $uri The URI on which to perform Yadis discovery.     *     * @param array $http_response An array reference where the HTTP     * response object will be stored (see {@link     * Auth_Yadis_HTTPResponse}.     *     * @param Auth_Yadis_HTTPFetcher $fetcher An instance of a     * Auth_Yadis_HTTPFetcher subclass.     *     * @param array $extra_ns_map An array which maps namespace names     * to namespace URIs to be used when parsing the Yadis XRDS     * document.     *     * @param integer $timeout An optional fetcher timeout, in seconds.     *     * @return mixed $obj Either null or an instance of     * Auth_Yadis_Yadis, depending on whether the discovery     * succeeded.     */    function discover($uri, &$fetcher,                      $extra_ns_map = null, $timeout = 20)    {        $result = new Auth_Yadis_DiscoveryResult($uri);        $request_uri = $uri;        $headers = array("Accept: " . Auth_Yadis_CONTENT_TYPE . ", text/html;q=0.9");        if (!$fetcher) {            $fetcher = Auth_Yadis_Yadis::getHTTPFetcher($timeout);        }        $response = $fetcher->get($uri, $headers);        if (!$response || ($response->status != 200)) {            $result->fail();            return $result;        }        $result->normalized_uri = $response->final_url;        $result->content_type = Auth_Yadis_Yadis::_getHeader(                                       $response->headers,                                       array('content-type'));        if ($result->content_type &&            (Auth_Yadis_Yadis::_getContentType($result->content_type) ==             Auth_Yadis_CONTENT_TYPE)) {            $result->xrds_uri = $result->normalized_uri;        } else {            $yadis_location = Auth_Yadis_Yadis::_getHeader(                                                 $response->headers,                                                 array(Auth_Yadis_HEADER_NAME));            if (!$yadis_location) {                $parser = new Auth_Yadis_ParseHTML();                $yadis_location = $parser->getHTTPEquiv($response->body);            }            if ($yadis_location) {                $result->xrds_uri = $yadis_location;                $response = $fetcher->get($yadis_location);                if ($response->status != 200) {                    $result->fail();                    return $result;                }                $result->content_type = Auth_Yadis_Yadis::_getHeader(                                                         $response->headers,                                                         array('content-type'));            }        }        $result->response_text = $response->body;        return $result;    }}?>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -