Cookie

class Cookie

Represents a cookie.

Constants

SAMESITE_LAX = 'lax';

SAMESITE_STRICT = 'strict';

Properties

protected $name
protected $value
protected $domain
protected $expire
protected $path
protected $secure
protected $httpOnly

Methods

public static Cookie fromString(string $cookie, bool $decode = false) Creates cookie from raw header string.
public __construct(string $name, string $value = null, int|string|DateTimeInterface $expire, string|null $path = '/', string $domain = null, bool $secure = false, bool $httpOnly = true, bool $raw = false, string $sameSite = null) No description
public string __toString() Returns the cookie as a string.
public string getName() Gets the name of the cookie.
public string|null getValue() Gets the value of the cookie.
public string|null getDomain() Gets the domain that the cookie is available to.
public int getExpiresTime() Gets the time the cookie expires.
public int getMaxAge() Gets the max-age attribute.
public string getPath() Gets the path on the server in which the cookie will be available on.
public bool isSecure() Checks whether the cookie should only be transmitted over a secure HTTPS connection from the client.
public bool isHttpOnly() Checks whether the cookie will be made accessible only through the HTTP protocol.
public bool isCleared() Whether this cookie is about to be cleared.
public bool isRaw() Checks if the cookie value should be sent with no url encoding.
public string|null getSameSite() Gets the SameSite attribute.

Details

at line 42

fromString()

public static Cookie fromString(string $cookie, bool $decode = false)

Creates cookie from raw header string.

Parameters

string $cookie
bool $decode

Return Value

Cookie
at line 96

__construct()

public __construct(string $name, string $value = null, int|string|DateTimeInterface $expire, string|null $path = '/', string $domain = null, bool $secure = false, bool $httpOnly = true, bool $raw = false, string $sameSite = null)

Parameters

string $name The name of the cookie
string $value The value of the cookie
int|string|DateTimeInterface $expire The time the cookie expires
string|null $path The path on the server in which the cookie will be available on
string $domain The domain that the cookie is available to
bool $secure Whether the cookie should only be transmitted over a secure HTTPS connection from the client
bool $httpOnly Whether the cookie will be made accessible only through the HTTP protocol
bool $raw Whether the cookie value should be sent with no url encoding
string $sameSite Whether the cookie will be available for cross-site requests

Exceptions

InvalidArgumentException
at line 143

__toString()

public string __toString()

Returns the cookie as a string.

Return Value

string The cookie
at line 185

getName()

public string getName()

Gets the name of the cookie.

Return Value

string
at line 195

getValue()

public string|null getValue()

Gets the value of the cookie.

Return Value

string|null
at line 205

getDomain()

public string|null getDomain()

Gets the domain that the cookie is available to.

Return Value

string|null
at line 215

getExpiresTime()

public int getExpiresTime()

Gets the time the cookie expires.

Return Value

int
at line 225

getMaxAge()

public int getMaxAge()

Gets the max-age attribute.

Return Value

int
at line 235

getPath()

public string getPath()

Gets the path on the server in which the cookie will be available on.

Return Value

string
at line 245

isSecure()

public bool isSecure()

Checks whether the cookie should only be transmitted over a secure HTTPS connection from the client.

Return Value

bool
at line 255

isHttpOnly()

public bool isHttpOnly()

Checks whether the cookie will be made accessible only through the HTTP protocol.

Return Value

bool
at line 265

isCleared()

public bool isCleared()

Whether this cookie is about to be cleared.

Return Value

bool
at line 275

isRaw()

public bool isRaw()

Checks if the cookie value should be sent with no url encoding.

Return Value

bool
at line 285

getSameSite()

public string|null getSameSite()

Gets the SameSite attribute.

Return Value

string|null

Source code

<?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 App\Khan\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;
    private $raw;
    private $sameSite;

    const SAMESITE_LAX = 'lax';
    const SAMESITE_STRICT = 'strict';

    /**
     * Creates cookie from raw header string.
     *
     * @param string $cookie
     * @param bool   $decode
     *
     * @return static
     */
    public static function fromString($cookie, $decode = false)
    {
        $data = array(
            'expires' => 0,
            'path' => '/',
            'domain' => null,
            'secure' => false,
            'httponly' => false,
            'raw' => !$decode,
            'samesite' => null,
        );
        foreach (explode(';', $cookie) as $part) {
            if (false === strpos($part, '=')) {
                $key = trim($part);
                $value = true;
            } else {
                list($key, $value) = explode('=', trim($part), 2);
                $key = trim($key);
                $value = trim($value);
            }
            if (!isset($data['name'])) {
                $data['name'] = $decode ? urldecode($key) : $key;
                $data['value'] = true === $value ? null : ($decode ? urldecode($value) : $value);
                continue;
            }
            switch ($key = strtolower($key)) {
                case 'name':
                case 'value':
                    break;
                case 'max-age':
                    $data['expires'] = time() + (int) $value;
                    break;
                default:
                    $data[$key] = $value;
                    break;
            }
        }

        return new static($data['name'], $data['value'], $data['expires'], $data['path'], $data['domain'], $data['secure'], $data['httponly'], $data['raw'], $data['samesite']);
    }

    /**
     * @param string                        $name     The name of the cookie
     * @param string|null                   $value    The value of the cookie
     * @param int|string|\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|null                   $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
     * @param bool                          $raw      Whether the cookie value should be sent with no url encoding
     * @param string|null                   $sameSite Whether the cookie will be available for cross-site requests
     *
     * @throws \InvalidArgumentException
     */
    public function __construct(string $name, string $value = null, $expire = 0, ?string $path = '/', string $domain = null, bool $secure = false, bool $httpOnly = true, bool $raw = false, string $sameSite = null)
    {
        // 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
        if ($expire instanceof \DateTimeInterface) {
            $expire = $expire->format('U');
        } elseif (!is_numeric($expire)) {
            $expire = strtotime($expire);

            if (false === $expire) {
                throw new \InvalidArgumentException('The cookie expiration time is not valid.');
            }
        }

        $this->name = $name;
        $this->value = $value;
        $this->domain = $domain;
        $this->expire = 0 < $expire ? (int) $expire : 0;
        $this->path = empty($path) ? '/' : $path;
        $this->secure = $secure;
        $this->httpOnly = $httpOnly;
        $this->raw = $raw;

        if (null !== $sameSite) {
            $sameSite = strtolower($sameSite);
        }

        if (!in_array($sameSite, array(self::SAMESITE_LAX, self::SAMESITE_STRICT, null), true)) {
            throw new \InvalidArgumentException('The "sameSite" parameter value is not valid.');
        }

        $this->sameSite = $sameSite;
    }

    /**
     * Returns the cookie as a string.
     *
     * @return string The cookie
     */
    public function __toString()
    {
        $str = ($this->isRaw() ? $this->getName() : urlencode($this->getName())).'=';

        if ('' === (string) $this->getValue()) {
            $str .= 'deleted; expires='.gmdate('D, d-M-Y H:i:s T', time() - 31536001).'; max-age=-31536001';
        } else {
            $str .= $this->isRaw() ? $this->getValue() : rawurlencode($this->getValue());

            if (0 !== $this->getExpiresTime()) {
                $str .= '; expires='.gmdate('D, d-M-Y H:i:s T', $this->getExpiresTime()).'; max-age='.$this->getMaxAge();
            }
        }

        if ($this->getPath()) {
            $str .= '; path='.$this->getPath();
        }

        if ($this->getDomain()) {
            $str .= '; domain='.$this->getDomain();
        }

        if (true === $this->isSecure()) {
            $str .= '; secure';
        }

        if (true === $this->isHttpOnly()) {
            $str .= '; httponly';
        }

        if (null !== $this->getSameSite()) {
            $str .= '; samesite='.$this->getSameSite();
        }

        return $str;
    }

    /**
     * Gets the name of the cookie.
     *
     * @return string
     */
    public function getName()
    {
        return $this->name;
    }

    /**
     * Gets the value of the cookie.
     *
     * @return string|null
     */
    public function getValue()
    {
        return $this->value;
    }

    /**
     * Gets the domain that the cookie is available to.
     *
     * @return string|null
     */
    public function getDomain()
    {
        return $this->domain;
    }

    /**
     * Gets the time the cookie expires.
     *
     * @return int
     */
    public function getExpiresTime()
    {
        return $this->expire;
    }

    /**
     * Gets the max-age attribute.
     *
     * @return int
     */
    public function getMaxAge()
    {
        return 0 !== $this->expire ? $this->expire - time() : 0;
    }

    /**
     * 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();
    }

    /**
     * Checks if the cookie value should be sent with no url encoding.
     *
     * @return bool
     */
    public function isRaw()
    {
        return $this->raw;
    }

    /**
     * Gets the SameSite attribute.
     *
     * @return string|null
     */
    public function getSameSite()
    {
        return $this->sameSite;
    }
}