Cloning a HeaderCollection yields deep copies of the Headers.

This commit is contained in:
PJ Dietz 2015-03-22 11:36:06 -04:00
parent 5f676cb79f
commit a2ae6fff7d
2 changed files with 56 additions and 0 deletions

View File

@ -4,6 +4,11 @@ namespace WellRESTed\Message\Header;
class HeaderCollection implements \ArrayAccess
{
/**
* @var array
*
* Hash array with keys as lowercase header names, Header[] as values.
*/
private $headers;
public function __construct()
@ -11,16 +16,28 @@ class HeaderCollection implements \ArrayAccess
$this->headers = [];
}
/**
* @param string $offset
* @return bool
*/
public function offsetExists($offset)
{
return isset($this->headers[strtolower($offset)]);
}
/**
* @param mixed $offset
* @return Header[]
*/
public function offsetGet($offset)
{
return $this->headers[strtolower($offset)];
}
/**
* @param string $offset
* @param string $value
*/
public function offsetSet($offset, $value)
{
$header = new Header($offset, $value);
@ -32,8 +49,27 @@ class HeaderCollection implements \ArrayAccess
}
}
/**
* @param string $offset
*/
public function offsetUnset($offset)
{
unset($this->headers[strtolower($offset)]);
}
/**
* Make a deep copy of all headers in the arrays
*/
public function __clone()
{
$originalHeaders = $this->headers;
$this->headers = [];
foreach ($originalHeaders as $name => $headers) {
$clonedHeaders = [];
foreach ($headers as $header) {
$clonedHeaders[] = clone $header;
}
$this->headers[$name] = $clonedHeaders;
}
}
}

View File

@ -74,4 +74,24 @@ class HeaderCollectionTest extends \PHPUnit_Framework_TestCase
unset($collection["set-cookie"]);
$this->assertFalse(isset($collection["set-cookie"]));
}
/**
* @covers WellRESTed\Message\Header\HeaderCollection::__clone
* @uses WellRESTed\Message\Header\HeaderCollection::__construct
* @uses WellRESTed\Message\Header\HeaderCollection::offsetSet
* @uses WellRESTed\Message\Header\HeaderCollection::offsetExists
* @uses WellRESTed\Message\Header\HeaderCollection::offsetUnset
* @uses WellRESTed\Message\Header\Header
*/
public function testCloneMakesDeepCopyOfHeaders()
{
$collection = new HeaderCollection();
$collection["Set-Cookie"] = "cat=Molly";
$clone = clone $collection;
unset($clone["Set-Cookie"]);
$this->assertTrue(isset($collection["set-cookie"]));
$this->assertFalse(isset($clone["set-cookie"]));
}
}