2010-04-19 13:12:42 +01:00
|
|
|
<?php
|
|
|
|
|
2010-08-20 22:09:55 +01:00
|
|
|
namespace Symfony\Component\BrowserKit;
|
2010-04-19 13:12:42 +01:00
|
|
|
|
|
|
|
/*
|
2010-04-24 00:22:16 +01:00
|
|
|
* This file is part of the Symfony package.
|
2010-04-19 13:12:42 +01:00
|
|
|
*
|
|
|
|
* (c) Fabien Potencier <fabien.potencier@symfony-project.com>
|
|
|
|
*
|
|
|
|
* For the full copyright and license information, please view the LICENSE
|
|
|
|
* file that was distributed with this source code.
|
|
|
|
*/
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Cookie represents an HTTP cookie.
|
|
|
|
*
|
|
|
|
* @author Fabien Potencier <fabien.potencier@symfony-project.com>
|
|
|
|
*/
|
|
|
|
class Cookie
|
|
|
|
{
|
2010-06-23 15:24:24 +01:00
|
|
|
const DATE_FORMAT = 'D, d-M-Y H:i:s T';
|
|
|
|
|
2010-05-06 12:25:53 +01:00
|
|
|
protected $name;
|
|
|
|
protected $value;
|
2010-06-23 15:24:24 +01:00
|
|
|
protected $expires;
|
2010-05-06 12:25:53 +01:00
|
|
|
protected $path;
|
|
|
|
protected $domain;
|
|
|
|
protected $secure;
|
2010-06-23 15:24:24 +01:00
|
|
|
protected $httponly;
|
2010-04-19 13:12:42 +01:00
|
|
|
|
2010-05-06 12:25:53 +01:00
|
|
|
/**
|
|
|
|
* Sets a cookie.
|
|
|
|
*
|
2010-06-23 15:24:24 +01:00
|
|
|
* @param string $name The cookie name
|
|
|
|
* @param string $value The value of the cookie
|
|
|
|
* @param string $expires The time the cookie expires
|
|
|
|
* @param string $path The path on the server in which the cookie will be available on
|
|
|
|
* @param string $domain The domain that the cookie is available
|
|
|
|
* @param bool $secure Indicates that the cookie should only be transmitted over a secure HTTPS connection from the client
|
|
|
|
* @param bool $httponly The cookie httponly flag
|
|
|
|
*/
|
|
|
|
public function __construct($name, $value, $expires = null, $path = '/', $domain = '', $secure = false, $httponly = false)
|
|
|
|
{
|
|
|
|
$this->name = $name;
|
|
|
|
$this->value = $value;
|
|
|
|
$this->expires = null === $expires ? null : (integer) $expires;
|
|
|
|
$this->path = empty($path) ? '/' : $path;
|
|
|
|
$this->domain = $domain;
|
|
|
|
$this->secure = (Boolean) $secure;
|
|
|
|
$this->httponly = (Boolean) $httponly;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Returns the HTTP representation of the Cookie.
|
|
|
|
*
|
|
|
|
* @return string The HTTP representation of the Cookie
|
|
|
|
*/
|
|
|
|
public function __toString()
|
|
|
|
{
|
|
|
|
$cookie = sprintf('%s=%s', $this->name, urlencode($this->value));
|
|
|
|
|
|
|
|
if (null !== $this->expires) {
|
|
|
|
$cookie .= '; expires='.substr(\DateTime::createFromFormat('U', $this->expires, new \DateTimeZone('UTC'))->format(static::DATE_FORMAT), 0, -5);
|
|
|
|
}
|
|
|
|
|
|
|
|
if ('' !== $this->domain) {
|
|
|
|
$cookie .= '; domain='.$this->domain;
|
|
|
|
}
|
|
|
|
|
2010-06-28 07:31:22 +01:00
|
|
|
if ('/' !== $this->path) {
|
|
|
|
$cookie .= '; path='.$this->path;
|
|
|
|
}
|
|
|
|
|
2010-06-23 15:24:24 +01:00
|
|
|
if ($this->secure) {
|
|
|
|
$cookie .= '; secure';
|
|
|
|
}
|
|
|
|
|
|
|
|
if ($this->httponly) {
|
|
|
|
$cookie .= '; httponly';
|
|
|
|
}
|
|
|
|
|
|
|
|
return $cookie;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Creates a Cookie instance from a Set-Cookie header value.
|
|
|
|
*
|
|
|
|
* @param string $cookie A Set-Cookie header value
|
|
|
|
* @param string $url The base URL
|
|
|
|
*
|
2010-07-27 14:33:28 +01:00
|
|
|
* @return Cookie A Cookie instance
|
2010-05-06 12:25:53 +01:00
|
|
|
*/
|
2010-06-23 15:24:24 +01:00
|
|
|
static public function fromString($cookie, $url = null)
|
2010-05-06 12:25:53 +01:00
|
|
|
{
|
2010-06-23 15:24:24 +01:00
|
|
|
$parts = explode(';', $cookie);
|
|
|
|
|
|
|
|
if (false === strpos($parts[0], '=')) {
|
|
|
|
throw new \InvalidArgumentException('The cookie string "%s" is not valid.');
|
|
|
|
}
|
|
|
|
|
|
|
|
list($name, $value) = explode('=', array_shift($parts), 2);
|
|
|
|
|
|
|
|
$values = array(
|
|
|
|
'name' => trim($name),
|
|
|
|
'value' => urldecode(trim($value)),
|
|
|
|
'expires' => null,
|
|
|
|
'path' => '/',
|
|
|
|
'domain' => '',
|
|
|
|
'secure' => false,
|
|
|
|
'httponly' => false,
|
|
|
|
);
|
|
|
|
|
|
|
|
if (null !== $url) {
|
|
|
|
if ((false === $parts = parse_url($url)) || !isset($parts['host']) || !isset($parts['path'])) {
|
|
|
|
throw new \InvalidArgumentException(sprintf('The URL "%s" is not valid.', $url));
|
|
|
|
}
|
|
|
|
|
|
|
|
$values['domain'] = $parts['host'];
|
|
|
|
$values['path'] = substr($parts['path'], 0, strrpos($parts['path'], '/'));
|
|
|
|
}
|
|
|
|
|
|
|
|
foreach ($parts as $part) {
|
|
|
|
$part = trim($part);
|
|
|
|
|
|
|
|
if ('secure' === strtolower($part)) {
|
|
|
|
$values['secure'] = true;
|
|
|
|
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
|
|
|
if ('httponly' === strtolower($part)) {
|
|
|
|
$values['httponly'] = true;
|
|
|
|
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (2 === count($elements = explode('=', $part, 2))) {
|
|
|
|
if ('expires' === $elements[0]) {
|
|
|
|
if (false === $date = \DateTime::createFromFormat(static::DATE_FORMAT, $elements[1], new \DateTimeZone('UTC'))) {
|
|
|
|
throw new \InvalidArgumentException(sprintf('The expires part of cookie is not valid (%s).', $elements[1]));
|
|
|
|
}
|
|
|
|
|
|
|
|
$elements[1] = $date->getTimestamp();
|
|
|
|
}
|
|
|
|
|
|
|
|
$values[strtolower($elements[0])] = $elements[1];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return new static(
|
|
|
|
$values['name'],
|
|
|
|
$values['value'],
|
|
|
|
$values['expires'],
|
|
|
|
$values['path'],
|
|
|
|
$values['domain'],
|
|
|
|
$values['secure'],
|
|
|
|
$values['httponly']
|
|
|
|
);
|
2010-05-06 12:25:53 +01:00
|
|
|
}
|
2010-04-19 13:12:42 +01:00
|
|
|
|
2010-05-06 12:25:53 +01:00
|
|
|
/**
|
|
|
|
* Gets the name of the cookie.
|
|
|
|
*
|
|
|
|
* @return string The cookie name
|
|
|
|
*/
|
|
|
|
public function getName()
|
|
|
|
{
|
|
|
|
return $this->name;
|
|
|
|
}
|
2010-04-19 13:12:42 +01:00
|
|
|
|
2010-05-06 12:25:53 +01:00
|
|
|
/**
|
|
|
|
* Gets the value of the cookie.
|
|
|
|
*
|
|
|
|
* @return string The cookie value
|
|
|
|
*/
|
|
|
|
public function getValue()
|
|
|
|
{
|
|
|
|
return $this->value;
|
|
|
|
}
|
2010-04-19 13:12:42 +01:00
|
|
|
|
2010-05-06 12:25:53 +01:00
|
|
|
/**
|
2010-06-23 15:24:24 +01:00
|
|
|
* Gets the expires time of the cookie.
|
2010-05-06 12:25:53 +01:00
|
|
|
*
|
2010-06-23 15:24:24 +01:00
|
|
|
* @return string The cookie expires time
|
2010-05-06 12:25:53 +01:00
|
|
|
*/
|
2010-06-23 15:24:24 +01:00
|
|
|
public function getExpiresTime()
|
2010-05-06 12:25:53 +01:00
|
|
|
{
|
2010-06-23 15:24:24 +01:00
|
|
|
return $this->expires;
|
2010-05-06 12:25:53 +01:00
|
|
|
}
|
2010-04-19 13:12:42 +01:00
|
|
|
|
2010-05-06 12:25:53 +01:00
|
|
|
/**
|
|
|
|
* Gets the path of the cookie.
|
|
|
|
*
|
|
|
|
* @return string The cookie path
|
|
|
|
*/
|
|
|
|
public function getPath()
|
|
|
|
{
|
|
|
|
return $this->path;
|
|
|
|
}
|
2010-04-19 13:12:42 +01:00
|
|
|
|
2010-05-06 12:25:53 +01:00
|
|
|
/**
|
|
|
|
* Gets the domain of the cookie.
|
|
|
|
*
|
|
|
|
* @return string The cookie domain
|
|
|
|
*/
|
|
|
|
public function getDomain()
|
|
|
|
{
|
|
|
|
return $this->domain;
|
|
|
|
}
|
2010-04-19 13:12:42 +01:00
|
|
|
|
2010-05-06 12:25:53 +01:00
|
|
|
/**
|
|
|
|
* Returns the secure flag of the cookie.
|
|
|
|
*
|
|
|
|
* @return Boolean The cookie secure flag
|
|
|
|
*/
|
|
|
|
public function isSecure()
|
|
|
|
{
|
|
|
|
return $this->secure;
|
|
|
|
}
|
2010-04-19 13:12:42 +01:00
|
|
|
|
2010-06-23 15:24:24 +01:00
|
|
|
/**
|
|
|
|
* Returns the httponly flag of the cookie.
|
|
|
|
*
|
|
|
|
* @return Boolean The cookie httponly flag
|
|
|
|
*/
|
|
|
|
public function isHttponly()
|
|
|
|
{
|
|
|
|
return $this->httponly;
|
|
|
|
}
|
|
|
|
|
2010-05-06 12:25:53 +01:00
|
|
|
/**
|
|
|
|
* Returns true if the cookie has expired.
|
|
|
|
*
|
|
|
|
* @return Boolean true if the cookie has expired, false otherwise
|
|
|
|
*/
|
|
|
|
public function isExpired()
|
|
|
|
{
|
2010-06-23 15:24:24 +01:00
|
|
|
return (null !== $this->expires) && $this->expires < time();
|
2010-05-06 12:25:53 +01:00
|
|
|
}
|
2010-04-19 13:12:42 +01:00
|
|
|
}
|