diff --git a/src/Message/Header/HeaderCollection.php b/src/Message/Header/HeaderCollection.php new file mode 100644 index 0000000..045b28a --- /dev/null +++ b/src/Message/Header/HeaderCollection.php @@ -0,0 +1,39 @@ +headers = []; + } + + public function offsetExists($offset) + { + return isset($this->headers[strtolower($offset)]); + } + + public function offsetGet($offset) + { + return $this->headers[strtolower($offset)]; + } + + 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]; + } + } + + public function offsetUnset($offset) + { + unset($this->headers[strtolower($offset)]); + } +} diff --git a/test/tests/unit/Message/Header/HeaderCollectionTest.php b/test/tests/unit/Message/Header/HeaderCollectionTest.php new file mode 100644 index 0000000..3b14178 --- /dev/null +++ b/test/tests/unit/Message/Header/HeaderCollectionTest.php @@ -0,0 +1,77 @@ +assertNotNull($collection); + } + + /** + * @covers WellRESTed\Message\Header\HeaderCollection::offsetSet + * @covers WellRESTed\Message\Header\HeaderCollection::offsetExists + * @uses WellRESTed\Message\Header\HeaderCollection::__construct + * @uses WellRESTed\Message\Header\Header + */ + public function testAddsSingleHeaderAndIndicatesCaseInsensitiveIsset() + { + $collection = new HeaderCollection(); + $collection["Content-Type"] = "application/json"; + $this->assertTrue(isset($collection["content-type"])); + } + + /** + * @covers WellRESTed\Message\Header\HeaderCollection::offsetSet + * @covers WellRESTed\Message\Header\HeaderCollection::offsetExists + * @uses WellRESTed\Message\Header\HeaderCollection::__construct + * @uses WellRESTed\Message\Header\Header + */ + public function testAddsMultipleHeadersAndIndicatesCaseInsensitiveIsset() + { + $collection = new HeaderCollection(); + $collection["Set-Cookie"] = "cat=Molly"; + $collection["SET-COOKIE"] = "dog=Bear"; + $this->assertTrue(isset($collection["set-cookie"])); + } + + /** + * @covers WellRESTed\Message\Header\HeaderCollection::offsetGet + * @uses WellRESTed\Message\Header\HeaderCollection::offsetSet + * @uses WellRESTed\Message\Header\HeaderCollection::__construct + * @uses WellRESTed\Message\Header\Header + */ + public function testReturnsHeadersWithCaseInsensitiveHeaderName() + { + $collection = new HeaderCollection(); + $collection["Set-Cookie"] = "cat=Molly"; + $collection["SET-COOKIE"] = "dog=Bear"; + + $headers = $collection["set-cookie"]; + $this->assertContains("Set-Cookie: cat=Molly", $headers); + $this->assertContains("SET-COOKIE: 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 + */ + public function testRemovesHeadersWithCaseInsensitiveHeaderName() + { + $collection = new HeaderCollection(); + $collection["Set-Cookie"] = "cat=Molly"; + $collection["SET-COOKIE"] = "dog=Bear"; + unset($collection["set-cookie"]); + $this->assertFalse(isset($collection["set-cookie"])); + } +}