Skip to content

Commit cad4d1b

Browse files
authored
Merge pull request #190 from alexdebril/issue/180
Handle wrong `if-modified-since` header
2 parents 8fdb760 + c3dd179 commit cad4d1b

File tree

3 files changed

+51
-5
lines changed

3 files changed

+51
-5
lines changed

Request/ModifiedSince.php

+12-3
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
namespace Debril\RssAtomBundle\Request;
44

55

6+
use Psr\Log\LoggerInterface;
67
use Symfony\Component\HttpFoundation\Request;
78
use Symfony\Component\HttpFoundation\RequestStack;
89

@@ -13,8 +14,11 @@ class ModifiedSince
1314

1415
private $value;
1516

16-
public function __construct(RequestStack $requestStack)
17+
private $logger;
18+
19+
public function __construct(RequestStack $requestStack, LoggerInterface $logger)
1720
{
21+
$this->logger = $logger;
1822
$this->value = $this->getModifiedSince($requestStack->getCurrentRequest());
1923
}
2024

@@ -29,10 +33,15 @@ public function getValue(): \DateTime
2933
private function getModifiedSince(Request $request):\DateTime
3034
{
3135
if ($request->headers->has(self::HTTP_HEADER_NAME)) {
32-
$string = $request->headers->get(self::HTTP_HEADER_NAME);
33-
return \DateTime::createFromFormat(\DateTime::RSS, $string);
36+
try {
37+
$string = $request->headers->get(self::HTTP_HEADER_NAME);
38+
return new \DateTime($string);
39+
} catch (\TypeError|\Exception $e) {
40+
$this->logger->notice(sprintf('If-Modified-Since Header has a unexpected value, exception was %s', $e->getMessage()));
41+
}
3442
}
3543

3644
return new \DateTime('@1');
3745
}
46+
3847
}

Tests/Request/ModifiedSinceTest.php

+37-1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
use Debril\RssAtomBundle\Request\ModifiedSince;
88
use PHPUnit\Framework\TestCase;
9+
use Psr\Log\NullLogger;
910
use Symfony\Component\HttpFoundation\Request;
1011
use Symfony\Component\HttpFoundation\RequestStack;
1112

@@ -20,7 +21,42 @@ public function testGetValue()
2021
$request->headers->set('If-Modified-Since', $date->format(\DATE_RSS));
2122
$stack->push($request);
2223

23-
$modifiedSince = new ModifiedSince($stack);
24+
$modifiedSince = new ModifiedSince($stack, new NullLogger());
25+
$this->assertEquals($date, $modifiedSince->getValue());
26+
}
27+
28+
public function testGetBadValue()
29+
{
30+
$stack = new RequestStack();
31+
$request = new Request();
32+
$request->headers->set('If-Modified-Since', 'something that is not a date');
33+
$stack->push($request);
34+
35+
$modifiedSince = new ModifiedSince($stack, new NullLogger());
36+
$this->assertInstanceOf('\DateTime', $modifiedSince->getValue());
37+
}
38+
39+
public function testGetEmptyArrayValue()
40+
{
41+
$stack = new RequestStack();
42+
$request = new Request();
43+
$request->headers->set('If-Modified-Since', array());
44+
$stack->push($request);
45+
46+
$modifiedSince = new ModifiedSince($stack, new NullLogger());
47+
$this->assertInstanceOf('\DateTime', $modifiedSince->getValue());
48+
}
49+
50+
51+
public function testGetValueInArray()
52+
{
53+
$stack = new RequestStack();
54+
$request = new Request();
55+
$date = new \DateTime('2018-06-01');
56+
$request->headers->set('If-Modified-Since', [$date->format(\DATE_RSS)]);
57+
$stack->push($request);
58+
59+
$modifiedSince = new ModifiedSince($stack, new NullLogger());
2460
$this->assertEquals($date, $modifiedSince->getValue());
2561
}
2662

Tests/Response/FeedBuilderTest.php

+2-1
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
use FeedIo\Feed;
1010
use FeedIo\FeedIo;
1111
use PHPUnit\Framework\TestCase;
12+
use Psr\Log\NullLogger;
1213
use Symfony\Component\HttpFoundation\Request;
1314
use Symfony\Component\HttpFoundation\RequestStack;
1415

@@ -38,7 +39,7 @@ public function setUp()
3839
$stack->push($request);
3940
$this->feedIo = Factory::create()->getFeedIo();
4041
$this->headersBuilder = new HeadersBuilder();
41-
$this->modifiedSince = new ModifiedSince($stack);
42+
$this->modifiedSince = new ModifiedSince($stack, new NullLogger());
4243
parent::setUp();
4344
}
4445

0 commit comments

Comments
 (0)