Browse Source

Merge pull request #6381 from cakephp/postgres-session

Fixes session data being corrupted when stored in postgres.
Mark Story 11 years ago
parent
commit
772ce39a14

+ 5 - 1
src/Network/Session/DatabaseSession.php

@@ -102,7 +102,11 @@ class DatabaseSession implements SessionHandlerInterface
             return false;
         }
 
-        return $result['data'];
+        if (is_string($result['data'])) {
+            return $result['data'];
+        }
+
+        return stream_get_contents($result['data']);
     }
 
     /**

+ 1 - 1
tests/Fixture/SessionsFixture.php

@@ -30,7 +30,7 @@ class SessionsFixture extends TestFixture
      */
     public $fields = [
         'id' => ['type' => 'string', 'length' => 128],
-        'data' => ['type' => 'text', 'null' => true],
+        'data' => ['type' => 'binary', 'null' => true],
         'expires' => ['type' => 'integer', 'length' => 11, 'null' => true],
         '_constraints' => ['primary' => ['type' => 'primary', 'columns' => ['id']]]
     ];

+ 15 - 0
tests/TestCase/Network/Session/DatabaseSessionTest.php

@@ -20,6 +20,7 @@ use Cake\Core\Configure;
 use Cake\Datasource\ConnectionManager;
 use Cake\Network\Session;
 use Cake\Network\Session\DatabaseSession;
+use Cake\ORM\Entity;
 use Cake\ORM\Table;
 use Cake\ORM\TableRegistry;
 use Cake\TestSuite\TestCase;
@@ -162,4 +163,18 @@ class DatabaseSessionTest extends TestCase
         $storage->gc(0);
         $this->assertFalse($storage->read('foo'));
     }
+
+    /**
+     * Tests serializing an entity
+     *
+     * @return void
+     */
+    public function testSerializeEntity()
+    {
+        $entity = new Entity();
+        $entity->value = 'something';
+        $result = $this->storage->write('key', serialize($entity));
+        $data = TableRegistry::get('Sessions')->get('key')->data;
+        $this->assertEquals(serialize($entity), stream_get_contents($data));
+    }
 }