Refactor HeaderCollection to store headers as string[] instead of Header[]

Remove Header
Move Header out of own namespace to Message
This commit is contained in:
PJ Dietz 2015-03-22 12:05:48 -04:00
parent a2ae6fff7d
commit 2575bc743e
5 changed files with 91 additions and 211 deletions

View File

@ -1,50 +0,0 @@
<?php
namespace WellRESTed\Message\Header;
/**
* Represents an HTTP Header
*/
class Header
{
private $name;
private $value;
public function __construct($name, $value)
{
$this->name = $name;
$this->value = $value;
}
/**
* @return string Header line as name: value
*/
public function __toString()
{
return $this->getHeaderLine();
}
/**
* @return string Original header name with case preserved
*/
public function getName()
{
return $this->name;
}
/**
* @return string Header value
*/
public function getValue()
{
return $this->value;
}
/**
* @return string Header line as name: value
*/
public function getHeaderLine()
{
return $this->name . ": " . $this->value;
}
}

View File

@ -1,75 +0,0 @@
<?php
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()
{
$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);
$normalized = strtolower($offset);
if (isset($this->headers[$normalized])) {
$this->headers[$normalized][] = $header;
} else {
$this->headers[$normalized] = [$header];
}
}
/**
* @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

@ -0,0 +1,69 @@
<?php
namespace WellRESTed\Message;
class HeaderCollection implements \ArrayAccess
{
/**
* @var array
*
* Hash array mapping lowercase header names to original case header names.
*/
private $fields;
/**
* @var array
*
* Hash array mapping lowercase header names to values as string[]
*/
private $values;
public function __construct()
{
$this->fields = [];
$this->values = [];
}
/**
* @param string $offset
* @return bool
*/
public function offsetExists($offset)
{
return isset($this->values[strtolower($offset)]);
}
/**
* @param mixed $offset
* @return string[]
*/
public function offsetGet($offset)
{
return $this->values[strtolower($offset)];
}
/**
* @param string $offset
* @param string $value
*/
public function offsetSet($offset, $value)
{
$normalized = strtolower($offset);
$this->fields[$normalized] = $offset;
if (isset($this->values[$normalized])) {
$this->values[$normalized][] = $value;
} else {
$this->values[$normalized] = [$value];
}
}
/**
* @param string $offset
*/
public function offsetUnset($offset)
{
$normalized = strtolower($offset);
unset($this->fields[$normalized]);
unset($this->values[$normalized]);
}
}

View File

@ -1,58 +0,0 @@
<?php
namespace WellRESTed\Test\Message\Header;
use WellRESTed\Message\Header\Header;
class HeaderTest extends \PHPUnit_Framework_TestCase
{
/**
* @covers WellRESTed\Message\Header\Header::__construct
*/
public function testCreatesInstance()
{
$header = new Header("Content-Type", "application/json");
$this->assertNotNull($header);
}
/**
* @covers WellRESTed\Message\Header\Header::getName
* @uses WellRESTed\Message\Header\Header::__construct
*/
public function testReturnsName()
{
$header = new Header("Content-Type", "application/json");
$this->assertEquals("Content-Type", $header->getName());
}
/**
* @covers WellRESTed\Message\Header\Header::getValue
* @uses WellRESTed\Message\Header\Header::__construct
*/
public function testReturnsValue()
{
$header = new Header("Content-Type", "application/json");
$this->assertEquals("application/json", $header->getValue());
}
/**
* @covers WellRESTed\Message\Header\Header::getHeaderLine
* @uses WellRESTed\Message\Header\Header::__construct
*/
public function testReturnsHeaderLine()
{
$header = new Header("Content-Type", "application/json");
$this->assertEquals("Content-Type: application/json", $header->getHeaderLine());
}
/**
* @covers WellRESTed\Message\Header\Header::__toString
* @uses WellRESTed\Message\Header\Header::__construct
* @uses WellRESTed\Message\Header\Header::getHeaderLine
*/
public function testToStringReturnsHeaderLine()
{
$header = new Header("Content-Type", "application/json");
$this->assertEquals("Content-Type: application/json", (string) $header);
}
}

View File

@ -1,13 +1,13 @@
<?php
namespace WellRESTed\Test\Message\Header;
namespace WellRESTed\Test\Message;
use WellRESTed\Message\Header\HeaderCollection;
use WellRESTed\Message\HeaderCollection;
class HeaderCollectionTest extends \PHPUnit_Framework_TestCase
{
/**
* @covers WellRESTed\Message\Header\HeaderCollection::__construct
* @covers WellRESTed\Message\HeaderCollection::__construct
*/
public function testCreatesInstance()
{
@ -16,10 +16,9 @@ class HeaderCollectionTest extends \PHPUnit_Framework_TestCase
}
/**
* @covers WellRESTed\Message\Header\HeaderCollection::offsetSet
* @covers WellRESTed\Message\Header\HeaderCollection::offsetExists
* @uses WellRESTed\Message\Header\HeaderCollection::__construct
* @uses WellRESTed\Message\Header\Header
* @covers WellRESTed\Message\HeaderCollection::offsetSet
* @covers WellRESTed\Message\HeaderCollection::offsetExists
* @uses WellRESTed\Message\HeaderCollection::__construct
*/
public function testAddsSingleHeaderAndIndicatesCaseInsensitiveIsset()
{
@ -29,10 +28,9 @@ class HeaderCollectionTest extends \PHPUnit_Framework_TestCase
}
/**
* @covers WellRESTed\Message\Header\HeaderCollection::offsetSet
* @covers WellRESTed\Message\Header\HeaderCollection::offsetExists
* @uses WellRESTed\Message\Header\HeaderCollection::__construct
* @uses WellRESTed\Message\Header\Header
* @covers WellRESTed\Message\HeaderCollection::offsetSet
* @covers WellRESTed\Message\HeaderCollection::offsetExists
* @uses WellRESTed\Message\HeaderCollection::__construct
*/
public function testAddsMultipleHeadersAndIndicatesCaseInsensitiveIsset()
{
@ -43,10 +41,9 @@ class HeaderCollectionTest extends \PHPUnit_Framework_TestCase
}
/**
* @covers WellRESTed\Message\Header\HeaderCollection::offsetGet
* @uses WellRESTed\Message\Header\HeaderCollection::offsetSet
* @uses WellRESTed\Message\Header\HeaderCollection::__construct
* @uses WellRESTed\Message\Header\Header
* @covers WellRESTed\Message\HeaderCollection::offsetGet
* @uses WellRESTed\Message\HeaderCollection::offsetSet
* @uses WellRESTed\Message\HeaderCollection::__construct
*/
public function testReturnsHeadersWithCaseInsensitiveHeaderName()
{
@ -55,16 +52,15 @@ class HeaderCollectionTest extends \PHPUnit_Framework_TestCase
$collection["SET-COOKIE"] = "dog=Bear";
$headers = $collection["set-cookie"];
$this->assertContains("Set-Cookie: cat=Molly", $headers);
$this->assertContains("SET-COOKIE: dog=Bear", $headers);
$this->assertContains("cat=Molly", $headers);
$this->assertContains("dog=Bear", $headers);
}
/**
* @covers WellRESTed\Message\Header\HeaderCollection::offsetUnset
* @uses WellRESTed\Message\Header\HeaderCollection::__construct
* @uses WellRESTed\Message\Header\HeaderCollection::offsetSet
* @uses WellRESTed\Message\Header\HeaderCollection::offsetExists
* @uses WellRESTed\Message\Header\Header
* @covers WellRESTed\Message\HeaderCollection::offsetUnset
* @uses WellRESTed\Message\HeaderCollection::__construct
* @uses WellRESTed\Message\HeaderCollection::offsetSet
* @uses WellRESTed\Message\HeaderCollection::offsetExists
*/
public function testRemovesHeadersWithCaseInsensitiveHeaderName()
{
@ -76,12 +72,10 @@ class HeaderCollectionTest extends \PHPUnit_Framework_TestCase
}
/**
* @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
* @uses WellRESTed\Message\HeaderCollection::__construct
* @uses WellRESTed\Message\HeaderCollection::offsetSet
* @uses WellRESTed\Message\HeaderCollection::offsetExists
* @uses WellRESTed\Message\HeaderCollection::offsetUnset
*/
public function testCloneMakesDeepCopyOfHeaders()
{