Skip to content

Commit

Permalink
Fix cookie component being inconsistent about writes.
Browse files Browse the repository at this point in the history
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
markstory committed Oct 29, 2013
1 parent eef2d91 commit 07f4779
Show file tree
Hide file tree
Showing 2 changed files with 57 additions and 9 deletions.
28 changes: 19 additions & 9 deletions lib/Cake/Controller/Component/CookieComponent.php
Expand Up @@ -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;
}
Expand Down
38 changes: 38 additions & 0 deletions lib/Cake/Test/Case/Controller/Component/CookieComponentTest.php
Expand Up @@ -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
*
Expand Down

0 comments on commit 07f4779

Please sign in to comment.