/** * Generate a new Cookie object from a cookie string * (for example the value of the Set-Cookie HTTP header) * * @static * @throws Zend_Http_Header_Exception_InvalidArgumentException * @param $headerLine * @param bool $bypassHeaderFieldName * @return array|SetCookie */ public static function fromString($headerLine, $bypassHeaderFieldName = false) { list($name, $value) = explode(': ', $headerLine, 2); // check to ensure proper header type for this factory if (strtolower($name) !== 'set-cookie') { throw new Zend_Http_Header_Exception_InvalidArgumentException('Invalid header line for Set-Cookie string: "' . $name . '"'); } $multipleHeaders = preg_split('#(?<!Sun|Mon|Tue|Wed|Thu|Fri|Sat),\\s*#', $value); $headers = array(); foreach ($multipleHeaders as $headerLine) { $header = new self(); $keyValuePairs = preg_split('#;\\s*#', $headerLine); foreach ($keyValuePairs as $keyValue) { if (strpos($keyValue, '=')) { list($headerKey, $headerValue) = preg_split('#=\\s*#', $keyValue, 2); } else { $headerKey = $keyValue; $headerValue = null; } // First K=V pair is always the cookie name and value if ($header->getName() === NULL) { $header->setName($headerKey); $header->setValue($headerValue); continue; } // Process the remanining elements switch (str_replace(array('-', '_'), '', strtolower($headerKey))) { case 'expires': $header->setExpires($headerValue); break; case 'domain': $header->setDomain($headerValue); break; case 'path': $header->setPath($headerValue); break; case 'secure': $header->setSecure(true); break; case 'httponly': $header->setHttponly(true); break; case 'version': $header->setVersion((int) $headerValue); break; case 'maxage': $header->setMaxAge((int) $headerValue); break; default: // Intentionally omitted } } $headers[] = $header; } return count($headers) == 1 ? array_pop($headers) : $headers; }