cookiemanager.php.tmp

来自「PHP 知识管理系统(基于树结构的知识管理系统), 英文原版的PHP源码。」· TMP 代码 · 共 184 行

TMP
184
字号
<?php/* vim: set expandtab tabstop=4 shiftwidth=4: */// +----------------------------------------------------------------------+// | PHP version 4                                                        |// +----------------------------------------------------------------------+// | Copyright (c) 1997-2003 The PHP Group                                |// +----------------------------------------------------------------------+// | This source file is subject to version 3.0 of the PHP license,       |// | that is bundled with this package in the file LICENSE, and is        |// | available through the world-wide-web at                              |// | http://www.php.net/license/3_0.txt.                                  |// | If you did not receive a copy of the PHP license and are unable to   |// | obtain it through the world-wide-web, please send a note to          |// | license@php.net so we can mail you a copy immediately.               |// +----------------------------------------------------------------------+// | Author: Alexey Borzov <avb@php.net>                                  |// +----------------------------------------------------------------------+//// $Id$/** * This class is used to store cookies and pass them between HTTP requests. *  * @package HTTP_Client * @author  Alexey Borzov <avb@php.net> * @version $Revision$ */class HTTP_Client_CookieManager{   /**    * An array containing cookie values    * @var array    */    var $_cookies = array();   /**    * Constructor    *     * @access public    */    function HTTP_Client_CookieManager()    {        // abstract    }   /**    * Adds cookies to the request    *     * @access public    * @param object An HTTP_Request object    */    function passCookies(&$request)    {        if (!empty($this->_cookies)) {            $url =& $request->_url;            // We do not check cookie's "expires" field, as we do not store deleted            // cookies in the array and our client does not work long enough for other            // cookies to expire. If some kind of persistence is added to this object,            // then expiration should be checked upon loading and session cookies should            // be cleared on saving.            $cookies = array();            foreach ($this->_cookies as $cookie) {                if ($this->_domainMatch($url->host, $cookie['domain']) && (0 === strpos($url->path, $cookie['path']))                    && (empty($cookie['secure']) || $url->protocol == 'https')) {                    $cookies[$cookie['name']][strlen($cookie['path'])] = $cookie['value'];                }            }            // cookies with longer paths go first            foreach ($cookies as $name => $values) {                krsort($values);                foreach ($values as $value) {                    $request->addCookie($name, $value);                }            }        }        return true;    }   /**    * Explicitly adds cookie to the list    *     * @param array An array representing cookie, this function expects all of the array's     *              fields to be set    * @access public    */    function addCookie($cookie)    {        $hash = $this->_makeHash($cookie['name'], $cookie['domain'], $cookie['path']);        $this->_cookies[$hash] = $cookie;    }   /**    * Updates cookie list from HTTP server response    *    * @access public    * @param object An HTTP_Request object with sendRequest() already done    */    function updateCookies(&$request)    {        if (false !== ($cookies = $request->getResponseCookies())) {            $url =& $request->_url;            foreach ($cookies as $cookie) {                // use the current domain by default                if (!isset($cookie['domain'])) {                    $cookie['domain'] = $url->host;                }                // use the path to the current page by default                if (!isset($cookie['path'])) {                    $cookie['path'] = DIRECTORY_SEPARATOR == dirname($url->path)? '/': dirname($url->path);                }                // check if the domains match                if ($this->_domainMatch($url->host, $cookie['domain'])) {                    $hash = $this->_makeHash($cookie['name'], $cookie['domain'], $cookie['path']);                    // if value is empty or the time is in the past the cookie is deleted, else added                    if (strlen($cookie['value'])                        && (!isset($cookie['expires']) || (strtotime($cookie['expires']) > time()))) {                        $this->_cookies[$hash] = $cookie;                    } elseif (isset($this->_cookies[$hash])) {                        unset($this->_cookies[$hash]);                    }                }            }        }    }   /**    * Generates a key for the $_cookies array.    *     * The cookies is uniquely identified by its name, domain and path.    * Thus we cannot make f.e. an associative array with name as a key, we should    * generate a key from these 3 values.    *     * @access private    * @param string    Cookie name    * @param string    Cookie domain    * @param string    Cookie path    * @return string   a key     */    function _makeHash($name, $domain, $path)    {        return md5($name . "\r\n" . $domain . "\r\n" . $path);    }   /**    * Checks whether a cookie domain matches a request host.    *     * Cookie domain can begin with a dot, it also must contain at least    * two dots.    *     * @access private    * @param string     request host    * @param string     cookie domain    * @return bool      match success    */    function _domainMatch($requestHost, $cookieDomain)    {        if ('.' != $cookieDomain{0}) {            return $requestHost == $cookieDomain;        } elseif (substr_count($cookieDomain, '.') < 2) {            return false;        } else {            return substr('.'. $requestHost, - strlen($cookieDomain)) == $cookieDomain;        }    }   /**    * Clears the $_cookies array    *    * @access public    */    function reset()    {        $this->_cookies = array();    }}?>

⌨️ 快捷键说明

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