Skip to content

Commit

Permalink
Shift responsibility for keeping Date header to ResponseHeaderBag
Browse files Browse the repository at this point in the history
  • Loading branch information
mpdude authored and fabpot committed Jun 16, 2017
1 parent 94a0d22 commit 28209d9
Show file tree
Hide file tree
Showing 3 changed files with 72 additions and 58 deletions.
19 changes: 0 additions & 19 deletions Response.php
Original file line number Diff line number Diff line change
Expand Up @@ -201,11 +201,6 @@ public function __construct($content = '', $status = 200, $headers = array())
$this->setContent($content);
$this->setStatusCode($status);
$this->setProtocolVersion('1.0');

/* RFC2616 - 14.18 says all Responses need to have a Date */
if (!$this->headers->has('Date')) {
$this->setDate(\DateTime::createFromFormat('U', time()));
}
}

/**
Expand Down Expand Up @@ -334,11 +329,6 @@ public function sendHeaders()
return $this;
}

/* RFC2616 - 14.18 says all Responses need to have a Date */
if (!$this->headers->has('Date')) {
$this->setDate(\DateTime::createFromFormat('U', time()));
}

// headers
foreach ($this->headers->allPreserveCaseWithoutCookies() as $name => $values) {
foreach ($values as $value) {
Expand Down Expand Up @@ -648,15 +638,6 @@ public function mustRevalidate()
*/
public function getDate()
{
/*
RFC2616 - 14.18 says all Responses need to have a Date.
Make sure we provide one even if it the header
has been removed in the meantime.
*/
if (!$this->headers->has('Date')) {
$this->setDate(\DateTime::createFromFormat('U', time()));
}

return $this->headers->getDate('Date');
}

Expand Down
20 changes: 20 additions & 0 deletions ResponseHeaderBag.php
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,11 @@ public function __construct(array $headers = array())
if (!isset($this->headers['cache-control'])) {
$this->set('Cache-Control', '');
}

/* RFC2616 - 14.18 says all Responses need to have a Date */
if (!isset($this->headers['date'])) {
$this->initDate();
}
}

/**
Expand Down Expand Up @@ -90,6 +95,10 @@ public function replace(array $headers = array())
if (!isset($this->headers['cache-control'])) {
$this->set('Cache-Control', '');
}

if (!isset($this->headers['date'])) {
$this->initDate();
}
}

/**
Expand Down Expand Up @@ -156,6 +165,10 @@ public function remove($key)
if ('cache-control' === $uniqueKey) {
$this->computedCacheControl = array();
}

if ('date' === $uniqueKey) {
$this->initDate();
}
}

/**
Expand Down Expand Up @@ -338,4 +351,11 @@ protected function computeCacheControlValue()

return $header;
}

private function initDate()
{
$now = \DateTime::createFromFormat('U', time());
$now->setTimezone(new \DateTimeZone('UTC'));
$this->set('Date', $now->format('D, d M Y H:i:s').' GMT');
}
}
91 changes: 52 additions & 39 deletions Tests/ResponseHeaderBagTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -20,48 +20,24 @@
*/
class ResponseHeaderBagTest extends TestCase
{
/**
* @dataProvider provideAllPreserveCase
*/
public function testAllPreserveCase($headers, $expected)
public function testAllPreserveCase()
{
$headers = array(
'fOo' => 'BAR',
'ETag' => 'xyzzy',
'Content-MD5' => 'Q2hlY2sgSW50ZWdyaXR5IQ==',
'P3P' => 'CP="CAO PSA OUR"',
'WWW-Authenticate' => 'Basic realm="WallyWorld"',
'X-UA-Compatible' => 'IE=edge,chrome=1',
'X-XSS-Protection' => '1; mode=block',
);

$bag = new ResponseHeaderBag($headers);
$allPreservedCase = $bag->allPreserveCase();

$this->assertEquals($expected, $bag->allPreserveCase(), '->allPreserveCase() gets all input keys in original case');
}

public function provideAllPreserveCase()
{
return array(
array(
array('fOo' => 'BAR'),
array('fOo' => array('BAR'), 'Cache-Control' => array('no-cache, private')),
),
array(
array('ETag' => 'xyzzy'),
array('ETag' => array('xyzzy'), 'Cache-Control' => array('private, must-revalidate')),
),
array(
array('Content-MD5' => 'Q2hlY2sgSW50ZWdyaXR5IQ=='),
array('Content-MD5' => array('Q2hlY2sgSW50ZWdyaXR5IQ=='), 'Cache-Control' => array('no-cache, private')),
),
array(
array('P3P' => 'CP="CAO PSA OUR"'),
array('P3P' => array('CP="CAO PSA OUR"'), 'Cache-Control' => array('no-cache, private')),
),
array(
array('WWW-Authenticate' => 'Basic realm="WallyWorld"'),
array('WWW-Authenticate' => array('Basic realm="WallyWorld"'), 'Cache-Control' => array('no-cache, private')),
),
array(
array('X-UA-Compatible' => 'IE=edge,chrome=1'),
array('X-UA-Compatible' => array('IE=edge,chrome=1'), 'Cache-Control' => array('no-cache, private')),
),
array(
array('X-XSS-Protection' => '1; mode=block'),
array('X-XSS-Protection' => array('1; mode=block'), 'Cache-Control' => array('no-cache, private')),
),
);
foreach (array_keys($headers) as $headerName) {
$this->assertArrayHasKey($headerName, $allPreservedCase, '->allPreserveCase() gets all input keys in original case');
}
}

public function testCacheControlHeader()
Expand Down Expand Up @@ -332,6 +308,43 @@ public function provideMakeDispositionFail()
);
}

public function testDateHeaderAddedOnCreation()
{
$now = time();

$bag = new ResponseHeaderBag();
$this->assertTrue($bag->has('Date'));

$this->assertEquals($now, $bag->getDate('Date')->getTimestamp());
}

public function testDateHeaderCanBeSetOnCreation()
{
$someDate = 'Thu, 23 Mar 2017 09:15:12 GMT';
$bag = new ResponseHeaderBag(array('Date' => $someDate));

$this->assertEquals($someDate, $bag->get('Date'));
}

public function testDateHeaderWillBeRecreatedWhenRemoved()
{
$someDate = 'Thu, 23 Mar 2017 09:15:12 GMT';
$bag = new ResponseHeaderBag(array('Date' => $someDate));
$bag->remove('Date');

// a (new) Date header is still present
$this->assertTrue($bag->has('Date'));
$this->assertNotEquals($someDate, $bag->get('Date'));
}

public function testDateHeaderWillBeRecreatedWhenHeadersAreReplaced()
{
$bag = new ResponseHeaderBag();
$bag->replace(array());

$this->assertTrue($bag->has('Date'));
}

private function assertSetCookieHeader($expected, ResponseHeaderBag $actual)
{
$this->assertRegExp('#^Set-Cookie:\s+'.preg_quote($expected, '#').'$#m', str_replace("\r\n", "\n", (string) $actual));
Expand Down

0 comments on commit 28209d9

Please sign in to comment.