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