# 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;
        }
    }