2015-08-17 17:00:26 -07:00
< ? php
/*
* This file is part of the Symfony package .
*
* ( c ) Fabien Potencier < fabien @ symfony . com >
*
* For the full copyright and license information , please view the LICENSE
* file that was distributed with this source code .
*/
namespace Symfony\Component\HttpFoundation ;
/**
* Represents a cookie .
*
* @ author Johannes M . Schmitt < schmittjoh @ gmail . com >
*/
class Cookie
{
protected $name ;
protected $value ;
protected $domain ;
protected $expire ;
protected $path ;
protected $secure ;
protected $httpOnly ;
/**
* Constructor .
*
2016-04-20 09:56:34 -07:00
* @ param string $name The name of the cookie
* @ param string $value The value of the cookie
* @ param int | string | \DateTime | \DateTimeInterface $expire 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 to
* @ param bool $secure Whether the cookie should only be transmitted over a secure HTTPS connection from the client
* @ param bool $httpOnly Whether the cookie will be made accessible only through the HTTP protocol
2015-08-17 17:00:26 -07:00
*
* @ throws \InvalidArgumentException
*/
public function __construct ( $name , $value = null , $expire = 0 , $path = '/' , $domain = null , $secure = false , $httpOnly = true )
{
// from PHP source code
if ( preg_match ( " /[=,; \t \r \n \013 \014 ]/ " , $name )) {
throw new \InvalidArgumentException ( sprintf ( 'The cookie name "%s" contains invalid characters.' , $name ));
}
if ( empty ( $name )) {
throw new \InvalidArgumentException ( 'The cookie name cannot be empty.' );
}
// convert expiration time to a Unix timestamp
2016-04-20 09:56:34 -07:00
if ( $expire instanceof \DateTime || $expire instanceof \DateTimeInterface ) {
2015-08-17 17:00:26 -07:00
$expire = $expire -> format ( 'U' );
} elseif ( ! is_numeric ( $expire )) {
$expire = strtotime ( $expire );
2017-02-02 16:28:38 -08:00
if ( false === $expire ) {
2015-08-17 17:00:26 -07:00
throw new \InvalidArgumentException ( 'The cookie expiration time is not valid.' );
}
}
$this -> name = $name ;
$this -> value = $value ;
$this -> domain = $domain ;
2017-02-02 16:28:38 -08:00
$this -> expire = 0 < $expire ? ( int ) $expire : 0 ;
2015-08-17 17:00:26 -07:00
$this -> path = empty ( $path ) ? '/' : $path ;
$this -> secure = ( bool ) $secure ;
$this -> httpOnly = ( bool ) $httpOnly ;
}
/**
* Returns the cookie as a string .
*
* @ return string The cookie
*/
public function __toString ()
{
$str = urlencode ( $this -> getName ()) . '=' ;
if ( '' === ( string ) $this -> getValue ()) {
$str .= 'deleted; expires=' . gmdate ( 'D, d-M-Y H:i:s T' , time () - 31536001 );
} else {
$str .= urlencode ( $this -> getValue ());
2017-02-02 16:28:38 -08:00
if ( 0 !== $this -> getExpiresTime ()) {
2015-08-17 17:00:26 -07:00
$str .= '; expires=' . gmdate ( 'D, d-M-Y H:i:s T' , $this -> getExpiresTime ());
}
}
if ( $this -> path ) {
$str .= '; path=' . $this -> path ;
}
if ( $this -> getDomain ()) {
$str .= '; domain=' . $this -> getDomain ();
}
if ( true === $this -> isSecure ()) {
$str .= '; secure' ;
}
if ( true === $this -> isHttpOnly ()) {
$str .= '; httponly' ;
}
return $str ;
}
/**
* Gets the name of the cookie .
*
* @ return string
*/
public function getName ()
{
return $this -> name ;
}
/**
* Gets the value of the cookie .
*
* @ return string
*/
public function getValue ()
{
return $this -> value ;
}
/**
* Gets the domain that the cookie is available to .
*
* @ return string
*/
public function getDomain ()
{
return $this -> domain ;
}
/**
* Gets the time the cookie expires .
*
* @ return int
*/
public function getExpiresTime ()
{
return $this -> expire ;
}
/**
* Gets the path on the server in which the cookie will be available on .
*
* @ return string
*/
public function getPath ()
{
return $this -> path ;
}
/**
* Checks whether the cookie should only be transmitted over a secure HTTPS connection from the client .
*
* @ return bool
*/
public function isSecure ()
{
return $this -> secure ;
}
/**
* Checks whether the cookie will be made accessible only through the HTTP protocol .
*
* @ return bool
*/
public function isHttpOnly ()
{
return $this -> httpOnly ;
}
/**
* Whether this cookie is about to be cleared .
*
* @ return bool
*/
public function isCleared ()
{
return $this -> expire < time ();
}
}