Updated to Drupal 8.5. Core Media not yet in use.
[yaffs-website] / vendor / symfony / http-foundation / ResponseHeaderBag.php
index 2b630d8a722764f01a602395c1a4cc24914aa19f..11a859326b047d2cd3ab6401a9fab116b16801a6 100644 (file)
@@ -24,26 +24,10 @@ class ResponseHeaderBag extends HeaderBag
     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);
@@ -51,21 +35,11 @@ class ResponseHeaderBag extends HeaderBag
         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;
     }
 
     /**
@@ -75,7 +49,22 @@ class ResponseHeaderBag extends HeaderBag
      */
     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;
     }
 
     /**
@@ -90,20 +79,50 @@ class ResponseHeaderBag extends HeaderBag
         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';
@@ -116,14 +135,24 @@ class ResponseHeaderBag extends HeaderBag
      */
     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();
+        }
     }
 
     /**
@@ -142,14 +171,10 @@ class ResponseHeaderBag extends HeaderBag
         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';
     }
 
     /**
@@ -174,6 +199,10 @@ class ResponseHeaderBag extends HeaderBag
                 unset($this->cookies[$domain]);
             }
         }
+
+        if (empty($this->cookies)) {
+            unset($this->headerNames['set-cookie']);
+        }
     }
 
     /**
@@ -301,4 +330,11 @@ class ResponseHeaderBag extends HeaderBag
 
         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');
+    }
 }