Browse Source

Add method allowing CookieCollections to be created from requests.

This will be necessary to expose the cookie objects on the server
request.
Mark Story 9 years ago
parent
commit
d1bd022d58

+ 19 - 1
src/Http/Cookie/CookieCollection.php

@@ -21,6 +21,7 @@ use InvalidArgumentException;
 use IteratorAggregate;
 use IteratorAggregate;
 use Psr\Http\Message\RequestInterface;
 use Psr\Http\Message\RequestInterface;
 use Psr\Http\Message\ResponseInterface;
 use Psr\Http\Message\ResponseInterface;
+use Psr\Http\Message\ServerRequestInterface;
 
 
 /**
 /**
  * Cookie Collection
  * Cookie Collection
@@ -61,7 +62,24 @@ class CookieCollection implements IteratorAggregate, Countable
     {
     {
         $cookies = static::parseSetCookieHeader($header);
         $cookies = static::parseSetCookieHeader($header);
 
 
-        return new CookieCollection($cookies);
+        return new static($cookies);
+    }
+
+    /**
+     * Create a new collection from the cookies in a ServerRequest
+     *
+     * @param array $header The array of set-cookie header values.
+     * @return static
+     */
+    public static function createFromServerRequest(ServerRequestInterface $request)
+    {
+        $data = $request->getCookieParams();
+        $cookies = [];
+        foreach ($data as $name => $value) {
+            $cookies[] = new Cookie($name, $value);
+        }
+
+        return new static($cookies);
     }
     }
 
 
     /**
     /**

+ 19 - 0
tests/TestCase/Http/Cookie/CookieCollectionTest.php

@@ -422,4 +422,23 @@ class CookieCollectionTest extends TestCase
         $this->assertTrue($cookies->has('expires'));
         $this->assertTrue($cookies->has('expires'));
         $this->assertTrue($cookies->has('expired'), 'Expired cookies should be present');
         $this->assertTrue($cookies->has('expired'), 'Expired cookies should be present');
     }
     }
+
+    /**
+     * test createFromServerRequest() building cookies from a header string.
+     *
+     * @return void
+     */
+    public function testCreateFromServerRequest()
+    {
+        $request = new ServerRequest(['cookies' => ['name' => 'val', 'cakephp' => 'rocks']]);
+        $cookies = CookieCollection::createFromServerRequest($request);
+        $this->assertCount(2, $cookies);
+        $this->assertTrue($cookies->has('name'));
+        $this->assertTrue($cookies->has('cakephp'));
+
+        $cookie = $cookies->get('name');
+        $this->assertSame('val', $cookie->getValue());
+        $this->assertSame('', $cookie->getPath(), 'No path on request cookies');
+        $this->assertSame('', $cookie->getDomain(), 'No domain on request cookies');
+    }
 }
 }