public function CookieParser::parseCookie

Parse a cookie string as set in a Set-Cookie HTTP header and return an associative array of data.

Parameters

string $cookie Cookie header value to parse:

string $host Host of an associated request:

string $path Path of an associated request:

bool $decode Set to TRUE to urldecode cookie values:

Return value

array|bool Returns FALSE on failure or returns an array of arrays, with each of the sub arrays including:

  • domain (string) - Domain of the cookie
  • path (string) - Path of the cookie
  • cookies (array) - Associative array of cookie names and values
  • max_age (int) - Lifetime of the cookie in seconds
  • version (int) - Version of the cookie specification. RFC 2965 is 1
  • secure (bool) - Whether or not this is a secure cookie
  • discard (bool) - Whether or not this is a discardable cookie
  • custom (string) - Custom cookie data array
  • comment (string) - How the cookie is intended to be used
  • comment_url (str)- URL that contains info on how it will be used
  • port (array|str) - Array of ports or null
  • http_only (bool) - HTTP only cookie

Overrides CookieParserInterface::parseCookie

File

drupal/core/vendor/guzzle/parser/Guzzle/Parser/Cookie/CookieParser.php, line 30

Class

CookieParser
Default Guzzle implementation of a Cookie parser

Namespace

Guzzle\Parser\Cookie

Code

public function parseCookie($cookie, $host = null, $path = null, $decode = false) {

  // Explode the cookie string using a series of semicolons
  $pieces = array_filter(array_map('trim', explode(';', $cookie)));

  // The name of the cookie (first kvp) must include an equal sign.
  if (empty($pieces) || !strpos($pieces[0], '=')) {
    return false;
  }

  // Create the default return array
  $data = array_merge(array_fill_keys(array_keys(self::$cookieParts), null), array(
    'cookies' => array(),
    'data' => array(),
    'path' => $path ?: '/',
    'http_only' => false,
    'discard' => false,
    'domain' => $host,
  ));
  $foundNonCookies = 0;

  // Add the cookie pieces into the parsed data array
  foreach ($pieces as $part) {
    $cookieParts = explode('=', $part, 2);
    $key = trim($cookieParts[0]);
    if (count($cookieParts) == 1) {

      // Can be a single value (e.g. secure, httpOnly)
      $value = true;
    }
    else {

      // Be sure to strip wrapping quotes
      $value = trim($cookieParts[1], " \n\r\t\0\v\"");
      if ($decode) {
        $value = urldecode($value);
      }
    }

    // Only check for non-cookies when cookies have been found
    if (!empty($data['cookies'])) {
      foreach (self::$cookieParts as $mapValue => $search) {
        if (!strcasecmp($search, $key)) {
          $data[$mapValue] = $mapValue == 'port' ? array_map('trim', explode(',', $value)) : $value;
          $foundNonCookies++;
          continue 2;
        }
      }
    }

    // If cookies have not yet been retrieved, or this value was not found in the pieces array, treat it as a
    // cookie. IF non-cookies have been parsed, then this isn't a cookie, it's cookie data. Cookies then data.
    $data[$foundNonCookies ? 'data' : 'cookies'][$key] = $value;
  }

  // Calculate the expires date
  if (!$data['expires'] && $data['max_age']) {
    $data['expires'] = time() + (int) $data['max_age'];
  }
  return $data;
}