cookies.php

来自「一款可以和GOOGLE媲美的开源统计系统,运用AJAX.功能强大. 无色提示:」· PHP 代码 · 共 380 行

PHP
380
字号
<?php    /**     *	Base include file for SimpleTest     *	@package	SimpleTest     *	@subpackage	WebTester     *	@version	$Id: cookies.php 163 2008-01-14 04:40:16Z matt $     */    /**#@+     *	include other SimpleTest class files     */    require_once(dirname(__FILE__) . '/url.php');    /**#@-*/        /**     *    Cookie data holder. Cookie rules are full of pretty     *    arbitary stuff. I have used...     *    http://wp.netscape.com/newsref/std/cookie_spec.html     *    http://www.cookiecentral.com/faq/	 *    @package SimpleTest	 *    @subpackage WebTester     */    class SimpleCookie {        var $_host;        var $_name;        var $_value;        var $_path;        var $_expiry;        var $_is_secure;                /**         *    Constructor. Sets the stored values.         *    @param string $name            Cookie key.         *    @param string $value           Value of cookie.         *    @param string $path            Cookie path if not host wide.         *    @param string $expiry          Expiry date as string.         *    @param boolean $is_secure      Currently ignored.         */        function SimpleCookie($name, $value = false, $path = false, $expiry = false, $is_secure = false) {            $this->_host = false;            $this->_name = $name;            $this->_value = $value;            $this->_path = ($path ? $this->_fixPath($path) : "/");            $this->_expiry = false;            if (is_string($expiry)) {                $this->_expiry = strtotime($expiry);            } elseif (is_integer($expiry)) {                $this->_expiry = $expiry;            }            $this->_is_secure = $is_secure;        }                /**         *    Sets the host. The cookie rules determine         *    that the first two parts are taken for         *    certain TLDs and three for others. If the         *    new host does not match these rules then the         *    call will fail.         *    @param string $host       New hostname.         *    @return boolean           True if hostname is valid.         *    @access public         */        function setHost($host) {            if ($host = $this->_truncateHost($host)) {                $this->_host = $host;                return true;            }            return false;        }                /**         *    Accessor for the truncated host to which this         *    cookie applies.         *    @return string       Truncated hostname.         *    @access public         */        function getHost() {            return $this->_host;        }                /**         *    Test for a cookie being valid for a host name.         *    @param string $host    Host to test against.         *    @return boolean        True if the cookie would be valid         *                           here.         */        function isValidHost($host) {            return ($this->_truncateHost($host) === $this->getHost());        }                /**         *    Extracts just the domain part that determines a         *    cookie's host validity.         *    @param string $host    Host name to truncate.         *    @return string        Domain or false on a bad host.         *    @access private         */        function _truncateHost($host) {            $tlds = SimpleUrl::getAllTopLevelDomains();            if (preg_match('/[a-z\-]+\.(' . $tlds . ')$/i', $host, $matches)) {                return $matches[0];            } elseif (preg_match('/[a-z\-]+\.[a-z\-]+\.[a-z\-]+$/i', $host, $matches)) {                return $matches[0];            }            return false;        }                /**         *    Accessor for name.         *    @return string       Cookie key.         *    @access public         */        function getName() {            return $this->_name;        }                /**         *    Accessor for value. A deleted cookie will         *    have an empty string for this.         *    @return string       Cookie value.         *    @access public         */        function getValue() {            return $this->_value;        }                /**         *    Accessor for path.         *    @return string       Valid cookie path.         *    @access public         */        function getPath() {            return $this->_path;        }                /**         *    Tests a path to see if the cookie applies         *    there. The test path must be longer or         *    equal to the cookie path.         *    @param string $path       Path to test against.         *    @return boolean           True if cookie valid here.         *    @access public         */        function isValidPath($path) {            return (strncmp(                    $this->_fixPath($path),                    $this->getPath(),                    strlen($this->getPath())) == 0);        }                /**         *    Accessor for expiry.         *    @return string       Expiry string.         *    @access public         */        function getExpiry() {            if (! $this->_expiry) {                return false;            }            return gmdate("D, d M Y H:i:s", $this->_expiry) . " GMT";        }                /**         *    Test to see if cookie is expired against         *    the cookie format time or timestamp.         *    Will give true for a session cookie.         *    @param integer/string $now  Time to test against. Result         *                                will be false if this time         *                                is later than the cookie expiry.         *                                Can be either a timestamp integer         *                                or a cookie format date.         *    @access public         */        function isExpired($now) {            if (! $this->_expiry) {                return true;            }            if (is_string($now)) {                $now = strtotime($now);            }            return ($this->_expiry < $now);        }                /**         *    Ages the cookie by the specified number of         *    seconds.         *    @param integer $interval   In seconds.         *    @public         */        function agePrematurely($interval) {            if ($this->_expiry) {                $this->_expiry -= $interval;            }        }                /**         *    Accessor for the secure flag.         *    @return boolean       True if cookie needs SSL.         *    @access public         */        function isSecure() {            return $this->_is_secure;        }                /**         *    Adds a trailing and leading slash to the path         *    if missing.         *    @param string $path            Path to fix.         *    @access private         */        function _fixPath($path) {            if (substr($path, 0, 1) != '/') {                $path = '/' . $path;            }            if (substr($path, -1, 1) != '/') {                $path .= '/';            }            return $path;        }    }        /**     *    Repository for cookies. This stuff is a     *    tiny bit browser dependent.	 *    @package SimpleTest	 *    @subpackage WebTester     */    class SimpleCookieJar {        var $_cookies;                /**         *    Constructor. Jar starts empty.         *    @access public         */        function SimpleCookieJar() {            $this->_cookies = array();        }                /**         *    Removes expired and temporary cookies as if         *    the browser was closed and re-opened.         *    @param string/integer $now   Time to test expiry against.         *    @access public         */        function restartSession($date = false) {            $surviving_cookies = array();            for ($i = 0; $i < count($this->_cookies); $i++) {                if (! $this->_cookies[$i]->getValue()) {                    continue;                }                if (! $this->_cookies[$i]->getExpiry()) {                    continue;                }                if ($date && $this->_cookies[$i]->isExpired($date)) {                    continue;                }                $surviving_cookies[] = $this->_cookies[$i];            }            $this->_cookies = $surviving_cookies;        }                /**         *    Ages all cookies in the cookie jar.         *    @param integer $interval     The old session is moved         *                                 into the past by this number         *                                 of seconds. Cookies now over         *                                 age will be removed.         *    @access public         */        function agePrematurely($interval) {            for ($i = 0; $i < count($this->_cookies); $i++) {                $this->_cookies[$i]->agePrematurely($interval);            }        }                /**         *    Sets an additional cookie. If a cookie has         *    the same name and path it is replaced.         *    @param string $name       Cookie key.         *    @param string $value      Value of cookie.         *    @param string $host       Host upon which the cookie is valid.         *    @param string $path       Cookie path if not host wide.         *    @param string $expiry     Expiry date.         *    @access public         */        function setCookie($name, $value, $host = false, $path = '/', $expiry = false) {            $cookie = new SimpleCookie($name, $value, $path, $expiry);            if ($host) {                $cookie->setHost($host);            }            $this->_cookies[$this->_findFirstMatch($cookie)] = $cookie;        }                /**         *    Finds a matching cookie to write over or the         *    first empty slot if none.         *    @param SimpleCookie $cookie    Cookie to write into jar.         *    @return integer                Available slot.         *    @access private         */        function _findFirstMatch($cookie) {            for ($i = 0; $i < count($this->_cookies); $i++) {                $is_match = $this->_isMatch(                        $cookie,                        $this->_cookies[$i]->getHost(),                        $this->_cookies[$i]->getPath(),                        $this->_cookies[$i]->getName());                if ($is_match) {                    return $i;                }            }            return count($this->_cookies);        }                /**         *    Reads the most specific cookie value from the         *    browser cookies. Looks for the longest path that         *    matches.         *    @param string $host        Host to search.         *    @param string $path        Applicable path.         *    @param string $name        Name of cookie to read.         *    @return string             False if not present, else the         *                               value as a string.         *    @access public         */        function getCookieValue($host, $path, $name) {            $longest_path = '';            foreach ($this->_cookies as $cookie) {                if ($this->_isMatch($cookie, $host, $path, $name)) {                    if (strlen($cookie->getPath()) > strlen($longest_path)) {                        $value = $cookie->getValue();                        $longest_path = $cookie->getPath();                    }                }            }            return (isset($value) ? $value : false);        }                /**         *    Tests cookie for matching against search         *    criteria.         *    @param SimpleTest $cookie    Cookie to test.         *    @param string $host          Host must match.         *    @param string $path          Cookie path must be shorter than         *                                 this path.         *    @param string $name          Name must match.         *    @return boolean              True if matched.         *    @access private         */        function _isMatch($cookie, $host, $path, $name) {            if ($cookie->getName() != $name) {                return false;            }            if ($host && $cookie->getHost() && ! $cookie->isValidHost($host)) {                return false;            }            if (! $cookie->isValidPath($path)) {                return false;            }            return true;        }                /**         *    Uses a URL to sift relevant cookies by host and         *    path. Results are list of strings of form "name=value".         *    @param SimpleUrl $url       Url to select by.         *    @return array               Valid name and value pairs.         *    @access public         */        function selectAsPairs($url) {            $pairs = array();            foreach ($this->_cookies as $cookie) {                if ($this->_isMatch($cookie, $url->getHost(), $url->getPath(), $cookie->getName())) {                    $pairs[] = $cookie->getName() . '=' . $cookie->getValue();                }            }            return $pairs;        }    }?>

⌨️ 快捷键说明

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