Browse Source

urldecode data in cookies.

This was missing in the previous implementation but is necessary to
cover use cases like handling complex JSON cookie data from other
CakePHP applications.
Mark Story 9 years ago
parent
commit
6349b31776

+ 2 - 9
src/Http/Cookie/CookieCollection.php

@@ -222,14 +222,7 @@ class CookieCollection implements IteratorAggregate, Countable
         $cookies = [];
         foreach ($values as $value) {
             $value = rtrim($value, ';');
-            $nestedSemi = '";"';
-            if (strpos($value, $nestedSemi) !== false) {
-                $value = str_replace($nestedSemi, "{__cookie_replace__}", $value);
-                $parts = explode(';', $value);
-                $parts = str_replace("{__cookie_replace__}", $nestedSemi, $parts);
-            } else {
-                $parts = preg_split('/\;[ \t]*/', $value);
-            }
+            $parts = preg_split('/\;[ \t]*/', $value);
 
             $name = false;
             $cookie = [
@@ -249,7 +242,7 @@ class CookieCollection implements IteratorAggregate, Countable
                 }
                 if ($i === 0) {
                     $name = $key;
-                    $cookie['value'] = $value;
+                    $cookie['value'] = urldecode($value);
                     continue;
                 }
                 $key = strtolower($key);

+ 22 - 1
tests/TestCase/Http/Cookie/CookieCollectionTest.php

@@ -227,6 +227,27 @@ class CookieCollectionTest extends TestCase
     }
 
     /**
+     * Test adding cookies that contain URL encoded data
+     *
+     * @return void
+     */
+    public function testAddFromResponseValueUrldecodeData()
+    {
+        $collection = new CookieCollection();
+        $request = new ServerRequest([
+            'url' => '/app'
+        ]);
+        $response = (new Response())
+            ->withAddedHeader('Set-Cookie', 'test=val%3Bue; Path=/example; Secure;');
+        $new = $collection->addFromResponse($response, $request);
+        $this->assertTrue($new->has('test'));
+
+        $test = $new->get('test');
+        $this->assertSame('val;ue', $test->getValue());
+        $this->assertSame('/example', $test->getPath());
+    }
+
+    /**
      * Test adding cookies from a response ignores expired cookies
      *
      * @return void
@@ -239,7 +260,7 @@ class CookieCollectionTest extends TestCase
         ]);
         $response = (new Response())
             ->withAddedHeader('Set-Cookie', 'test=value')
-            ->withAddedHeader('Set-Cookie', 'expired=soon; Expires=Wed, 09-Jun-2012 10:18:14 GMT; Path=/; HttpOnly; Secure;');
+            ->withAddedHeader('Set-Cookie', 'expired=soon; Expires=Wed, 09-Jun-2012 10:18:14 GMT; Path=/;');
         $new = $collection->addFromResponse($response, $request);
         $this->assertFalse($new->has('expired'),'Should drop expired cookies');
     }