const DISPOSITION_ATTACHMENT = 'attachment';
const DISPOSITION_INLINE = 'inline';
- /**
- * @var array
- */
protected $computedCacheControl = array();
-
- /**
- * @var array
- */
protected $cookies = array();
-
- /**
- * @var array
- */
protected $headerNames = array();
- /**
- * Constructor.
- *
- * @param array $headers An array of HTTP headers
- */
public function __construct(array $headers = array())
{
parent::__construct($headers);
if (!isset($this->headers['cache-control'])) {
$this->set('Cache-Control', '');
}
- }
- /**
- * {@inheritdoc}
- */
- public function __toString()
- {
- $cookies = '';
- foreach ($this->getCookies() as $cookie) {
- $cookies .= 'Set-Cookie: '.$cookie."\r\n";
+ /* RFC2616 - 14.18 says all Responses need to have a Date */
+ if (!isset($this->headers['date'])) {
+ $this->initDate();
}
-
- ksort($this->headerNames);
-
- return parent::__toString().$cookies;
}
/**
*/
public function allPreserveCase()
{
- return array_combine($this->headerNames, $this->headers);
+ $headers = array();
+ foreach ($this->all() as $name => $value) {
+ $headers[isset($this->headerNames[$name]) ? $this->headerNames[$name] : $name] = $value;
+ }
+
+ return $headers;
+ }
+
+ public function allPreserveCaseWithoutCookies()
+ {
+ $headers = $this->allPreserveCase();
+ if (isset($this->headerNames['set-cookie'])) {
+ unset($headers[$this->headerNames['set-cookie']]);
+ }
+
+ return $headers;
}
/**
if (!isset($this->headers['cache-control'])) {
$this->set('Cache-Control', '');
}
+
+ if (!isset($this->headers['date'])) {
+ $this->initDate();
+ }
}
/**
* {@inheritdoc}
*/
- public function set($key, $values, $replace = true)
+ public function all()
{
- parent::set($key, $values, $replace);
+ $headers = parent::all();
+ foreach ($this->getCookies() as $cookie) {
+ $headers['set-cookie'][] = (string) $cookie;
+ }
+ return $headers;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function set($key, $values, $replace = true)
+ {
$uniqueKey = str_replace('_', '-', strtolower($key));
+
+ if ('set-cookie' === $uniqueKey) {
+ if ($replace) {
+ $this->cookies = array();
+ }
+ foreach ((array) $values as $cookie) {
+ $this->setCookie(Cookie::fromString($cookie));
+ }
+ $this->headerNames[$uniqueKey] = $key;
+
+ return;
+ }
+
$this->headerNames[$uniqueKey] = $key;
+ parent::set($key, $values, $replace);
+
// ensure the cache-control header has sensible defaults
- if (in_array($uniqueKey, array('cache-control', 'etag', 'last-modified', 'expires'))) {
+ if (\in_array($uniqueKey, array('cache-control', 'etag', 'last-modified', 'expires'), true)) {
$computed = $this->computeCacheControlValue();
$this->headers['cache-control'] = array($computed);
$this->headerNames['cache-control'] = 'Cache-Control';
*/
public function remove($key)
{
- parent::remove($key);
-
$uniqueKey = str_replace('_', '-', strtolower($key));
unset($this->headerNames[$uniqueKey]);
+ if ('set-cookie' === $uniqueKey) {
+ $this->cookies = array();
+
+ return;
+ }
+
+ parent::remove($key);
+
if ('cache-control' === $uniqueKey) {
$this->computedCacheControl = array();
}
+
+ if ('date' === $uniqueKey) {
+ $this->initDate();
+ }
}
/**
return array_key_exists($key, $this->computedCacheControl) ? $this->computedCacheControl[$key] : null;
}
- /**
- * Sets a cookie.
- *
- * @param Cookie $cookie
- */
public function setCookie(Cookie $cookie)
{
$this->cookies[$cookie->getDomain()][$cookie->getPath()][$cookie->getName()] = $cookie;
+ $this->headerNames['set-cookie'] = 'Set-Cookie';
}
/**
unset($this->cookies[$domain]);
}
}
+
+ if (empty($this->cookies)) {
+ unset($this->headerNames['set-cookie']);
+ }
}
/**
return $header;
}
+
+ private function initDate()
+ {
+ $now = \DateTime::createFromFormat('U', time());
+ $now->setTimezone(new \DateTimeZone('UTC'));
+ $this->set('Date', $now->format('D, d M Y H:i:s').' GMT');
+ }
}