Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit e3d90db

Browse files
committed
bug #22036 Set Date header in Response constructor already (mpdude)
This PR was squashed before being merged into the 2.8 branch (closes #22036). Discussion ---------- Set Date header in Response constructor already | Q | A | ------------- | --- | Branch? | 2.8 | Bug fix? | yes | New feature? | no | BC breaks? | no | Deprecations? | no | Tests pass? | yes | Fixed tickets | | License | MIT | Doc PR | Setting the `Date` header in the `Response` constructor has been removed in #14912 and changed to a more lazy approach in `getDate()`. That way, methods like `getAge()`, `getTtl()` or `isFresh()` cause side effects as they eventually call `getDate()` and the Request "starts to age" once you call them. I don't know if this would be a nice test, but current behaviour is ```php $response = new Response(); $response->setSharedMaxAge(10); sleep(20); $this->assertTrue($response->isFresh()); sleep(5); $this->assertTrue($response->isFresh()); sleep(5); $this->assertFalse($response->isFresh()); ``` A particular weird case is the `isCacheable()` method, because it calls `isFresh()` only under certain conditions, like particular status codes, no `ETag` present etc. This symptom is also described under "Cause of the problem" in #19390, however the problem is worked around there in other ways. So, this PR suggests to effectively revert #14912. Additionally, I'd like to suggest to move this special handling of the `Date` header into the `ResponseHeaderBag`. If the `ResponseHeaderBag` guards that we always have the `Date`, we would not need special logic in `sendHeaders()` and could also take care of #14912 (comment). Commits ------- 3a7fa7e Set Date header in Response constructor already
2 parents 89bb895 + 3a7fa7e commit e3d90db

File tree

2 files changed

+14
-1
lines changed

2 files changed

+14
-1
lines changed

src/Symfony/Component/HttpFoundation/Response.php

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -201,6 +201,11 @@ public function __construct($content = '', $status = 200, $headers = array())
201201
$this->setContent($content);
202202
$this->setStatusCode($status);
203203
$this->setProtocolVersion('1.0');
204+
205+
/* RFC2616 - 14.18 says all Responses need to have a Date */
206+
if (!$this->headers->has('Date')) {
207+
$this->setDate(new \DateTime(null, new \DateTimeZone('UTC')));
208+
}
204209
}
205210

206211
/**
@@ -329,6 +334,7 @@ public function sendHeaders()
329334
return $this;
330335
}
331336

337+
/* RFC2616 - 14.18 says all Responses need to have a Date */
332338
if (!$this->headers->has('Date')) {
333339
$this->setDate(\DateTime::createFromFormat('U', time()));
334340
}
@@ -612,6 +618,11 @@ public function mustRevalidate()
612618
*/
613619
public function getDate()
614620
{
621+
/*
622+
RFC2616 - 14.18 says all Responses need to have a Date.
623+
Make sure we provide one even if it the header
624+
has been removed in the meantime.
625+
*/
615626
if (!$this->headers->has('Date')) {
616627
$this->setDate(\DateTime::createFromFormat('U', time()));
617628
}

src/Symfony/Component/HttpFoundation/Tests/ResponseTest.php

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -276,8 +276,10 @@ public function testGetDate()
276276
$this->assertEquals($now->getTimestamp(), $date->getTimestamp(), '->getDate() returns the date when the header has been modified');
277277

278278
$response = new Response('', 200);
279+
$now = $this->createDateTimeNow();
279280
$response->headers->remove('Date');
280-
$this->assertInstanceOf('\DateTime', $response->getDate());
281+
$date = $response->getDate();
282+
$this->assertEquals($now->getTimestamp(), $date->getTimestamp(), '->getDate() returns the current Date when the header has previously been removed');
281283
}
282284

283285
public function testGetMaxAge()

0 commit comments

Comments
 (0)