Session read working

This commit is contained in:
Chris Boden 2012-03-27 14:29:56 -04:00
parent 592752e18a
commit 33ed96eba0
6 changed files with 138 additions and 12 deletions

View File

@ -0,0 +1,16 @@
<?php
namespace Ratchet\Component\Session\Serialize;
interface HandlerInterface {
/**
* @param array
* @return string
*/
function serialize(array $data);
/**
* @param string
* @return array
*/
function unserialize($raw);
}

View File

@ -0,0 +1,33 @@
<?php
namespace Ratchet\Component\Session\Serialize;
class PhpBinaryHandler implements HandlerInterface {
/**
* {@inheritdoc}
*/
function serialize(array $data) {
throw new \RuntimeException("Serialize PhpHandler:serialize code not written yet, write me!");
}
/**
* {@inheritdoc}
* @link http://ca2.php.net/manual/en/function.session-decode.php#108037 Code from this comment on php.net
*/
public function unserialize($raw) {
$returnData = array();
$offset = 0;
while ($offset < strlen($raw)) {
$num = ord($raw[$offset]);
$offset += 1;
$varname = substr($raw, $offset, $num);
$offset += $num;
$data = unserialize(substr($raw, $offset));
$returnData[$varname] = $data;
$offset += strlen(serialize($data));
}
return $returnData;
}
}

View File

@ -0,0 +1,37 @@
<?php
namespace Ratchet\Component\Session\Serialize;
class PhpHandler implements HandlerInterface {
/**
* {@inheritdoc}
*/
function serialize(array $data) {
throw new \RuntimeException("Serialize PhpHandler:serialize code not written yet, write me!");
}
/**
* {@inheritdoc}
* @link http://ca2.php.net/manual/en/function.session-decode.php#108037 Code from this comment on php.net
*/
public function unserialize($raw) {
$returnData = array();
$offset = 0;
while ($offset < strlen($raw)) {
if (!strstr(substr($raw, $offset), "|")) {
throw new Exception("invalid data, remaining: " . substr($raw, $offset));
}
$pos = strpos($raw, "|", $offset);
$num = $pos - $offset;
$varname = substr($raw, $offset, $num);
$offset += $num + 1;
$data = unserialize(substr($raw, $offset));
$returnData[$varname] = $data;
$offset += strlen(serialize($data));
}
return $returnData;
}
}

View File

@ -3,6 +3,7 @@ namespace Ratchet\Component\Session;
use Ratchet\Component\MessageComponentInterface;
use Ratchet\Resource\ConnectionInterface;
use Ratchet\Component\Session\Storage\VirtualSessionStorage;
use Ratchet\Component\Session\Serialize\HandlerInterface;
use Symfony\Component\HttpFoundation\Session\Session;
use Symfony\Component\HttpFoundation\Session\Storage\Handler\NullSessionHandler;
@ -13,7 +14,9 @@ class SessionComponent implements MessageComponentInterface {
protected $_handler;
protected $_null;
public function __construct(MessageComponentInterface $app, \SessionHandlerInterface $handler, array $options = array()) {
protected $_serializer;
public function __construct(MessageComponentInterface $app, \SessionHandlerInterface $handler, array $options = array(), HandlerInterface $serializer = null) {
$this->_app = $app;
$this->_handler = $handler;
$this->_options = array();
@ -24,6 +27,17 @@ class SessionComponent implements MessageComponentInterface {
ini_set('session.use_cookies', 0);
$options = $this->setOptions($options);
if (null === $serializer) {
$serialClass = __NAMESPACE__ . '\\Serialize\\' . str_replace(' ', '', ucwords(str_replace('_', ' ', ini_get('session.serialize_handler')))) . 'Handler'; // awesome/terrible hack, eh?
if (!class_exists($serialClass)) {
throw new \RuntimeExcpetion('Unable to parse session serialize handler');
}
$serializer = new $serialClass;
}
$this->_serializer = $serializer;
}
/**
@ -31,13 +45,13 @@ class SessionComponent implements MessageComponentInterface {
*/
function onOpen(ConnectionInterface $conn) {
if (null === ($id = $conn->WebSocket->headers->getCookie($this->_options['name']))) {
$saveHandler = new NullSessionHandler;
$saveHandler = $this->_null;
$id = '';
} else {
$saveHandler = $this->_handler;
}
$conn->Session = new Session(new VirtualSessionStorage($saveHandler, $id));
$conn->Session = new Session(new VirtualSessionStorage($saveHandler, $id, $this->_serializer));
return $this->_app->onOpen($conn);
}

View File

@ -3,17 +3,23 @@ namespace Ratchet\Component\Session\Storage\Proxy;
use Symfony\Component\HttpFoundation\Session\Storage\Proxy\SessionHandlerProxy;
class VirtualProxy extends SessionHandlerProxy {
/**
* @var string
*/
protected $_sessionId;
/**
* @var string
*/
protected $_sessionName;
/**
* {@inheritdoc}
*/
public function __construct(\SessionHandlerInterface $handler, $sessionId) {
public function __construct(\SessionHandlerInterface $handler) {
parent::__construct($handler);
$this->saveHandlerName = 'user';
$this->_sessionId = $sessionId;
$this->_sessionName = ini_get('session.name');
}
@ -24,8 +30,11 @@ class VirtualProxy extends SessionHandlerProxy {
return $this->_sessionId;
}
/**
* {@inheritdoc}
*/
public function setId($id) {
throw new \RuntimeException("Can not change session id in VirtualProxy");
$this->_sessionId = $id;
}
/**

View File

@ -2,13 +2,21 @@
namespace Ratchet\Component\Session\Storage;
use Symfony\Component\HttpFoundation\Session\Storage\NativeSessionStorage;
use Ratchet\Component\Session\Storage\Proxy\VirtualProxy;
use Ratchet\Component\Session\Serialize\HandlerInterface;
class VirtualSessionStorage extends NativeSessionStorage {
/**
* @var Ratchet\Component\Session\Serialize\HandlerInterface
*/
protected $_serializer;
/**
* {@inheritdoc}
*/
public function __construct(\SessionHandlerInterface $handler, $id) {
$this->setSaveHandler($handler, $id);
public function __construct(\SessionHandlerInterface $handler, $sessionId, HandlerInterface $serializer) {
$this->setSaveHandler($handler);
$this->saveHandler->setId($sessionId);
$this->_serializer = $serializer;
}
/**
@ -19,8 +27,10 @@ class VirtualSessionStorage extends NativeSessionStorage {
return true;
}
$ignore = array();
$this->loadSession($ignore);
$rawData = $this->saveHandler->read($this->saveHandler->getId());
$sessionData = $this->_serializer->unserialize($rawData);
$this->loadSession($sessionData);
if (!$this->saveHandler->isWrapper() && !$this->saveHandler->isSessionHandlerInterface()) {
$this->saveHandler->setActive(false);
@ -40,6 +50,9 @@ class VirtualSessionStorage extends NativeSessionStorage {
* {@inheritdoc}
*/
public function save() {
// get the data from the bags?
// serialize the data
// save the data using the saveHandler
// $this->saveHandler->write($this->saveHandler->getId(),
if (!$this->saveHandler->isWrapper() && !$this->getSaveHandler()->isSessionHandlerInterface()) {
@ -52,9 +65,13 @@ class VirtualSessionStorage extends NativeSessionStorage {
/**
* {@inheritdoc}
*/
public function setSaveHandler(\SessionHandlerInterface $saveHandler, $id) {
public function setSaveHandler($saveHandler = null) {
if (!($saveHandler instanceof \SessionHandlerInterface)) {
throw new \InvalidArgumentException('Handler must be instance of SessionHandlerInterface');
}
if (!($saveHandler instanceof \VirtualProxy)) {
$saveHandler = new VirtualProxy($saveHandler, $id);
$saveHandler = new VirtualProxy($saveHandler);
}
$this->saveHandler = $saveHandler;