Permalink
Browse files

Fix cookie component being inconsistent about writes.

Instead of treating multi-key and single key writes differently, they
should be treated consistently to allow simpler and more consistent interactions
with the stored data. This also results in fewer cookies being sent
across the wire which is an added benefit.

Fixes #2182
  • Loading branch information...
1 parent eef2d91 commit 07f4779efef507c31291ca0f29222c1b06d626b8 @markstory markstory committed Oct 29, 2013
@@ -230,17 +230,27 @@ public function write($key, $value = null, $encrypt = true, $expires = null) {
}
foreach ($key as $name => $value) {
- if (strpos($name, '.') === false) {
- $this->_values[$this->name][$name] = $value;
- $this->_write("[$name]", $value);
- } else {
+ $names = array($name);
+ if (strpos($name, '.') !== false) {
$names = explode('.', $name, 2);
- if (!isset($this->_values[$this->name][$names[0]])) {
- $this->_values[$this->name][$names[0]] = array();
- }
- $this->_values[$this->name][$names[0]] = Hash::insert($this->_values[$this->name][$names[0]], $names[1], $value);
- $this->_write('[' . implode('][', $names) . ']', $value);
}
+ $firstName = $names[0];
+ $isMultiValue = (is_array($value) || count($names) > 1);
+
+ if (!isset($this->_values[$this->name][$firstName]) && $isMultiValue) {
+ $this->_values[$this->name][$firstName] = array();
+ }
+
+ if (count($names) > 1) {
+ $this->_values[$this->name][$firstName] = Hash::insert(
+ $this->_values[$this->name][$firstName],
+ $names[1],
+ $value
+ );
+ } else {
+ $this->_values[$this->name][$firstName] = $value;
+ }
+ $this->_write('[' . $firstName . ']', $this->_values[$this->name][$firstName]);
}
$this->_encrypted = true;
}
@@ -327,6 +327,44 @@ public function testWriteArrayValues() {
$this->assertEquals($expected, $result);
}
+/**
+ * Test that writing mixed arrays results in the correct data.
+ *
+ * @return void
+ */
+ public function testWriteMixedArray() {
+ $this->Cookie->encrypt = false;
+ $this->Cookie->write('User', array('name' => 'mark'), false);
+ $this->Cookie->write('User.email', 'mark@example.com', false);
+ $expected = array(
+ 'name' => $this->Cookie->name . '[User]',
+ 'value' => '{"name":"mark","email":"mark@example.com"}',
+ 'path' => '/',
+ 'domain' => '',
+ 'secure' => false,
+ 'httpOnly' => false
+ );
+ $result = $this->Controller->response->cookie($this->Cookie->name . '[User]');
+ unset($result['expire']);
+
+ $this->assertEquals($expected, $result);
+
+ $this->Cookie->write('User.email', 'mark@example.com', false);
+ $this->Cookie->write('User', array('name' => 'mark'), false);
+ $expected = array(
+ 'name' => $this->Cookie->name . '[User]',
+ 'value' => '{"name":"mark"}',
+ 'path' => '/',
+ 'domain' => '',
+ 'secure' => false,
+ 'httpOnly' => false
+ );
+ $result = $this->Controller->response->cookie($this->Cookie->name . '[User]');
+ unset($result['expire']);
+
+ $this->assertEquals($expected, $result);
+ }
+
/**
* testReadingCookieValue
*

0 comments on commit 07f4779

Please sign in to comment.