Skip to content

Commit 670e0f3

Browse files
Merge branch '5.4' into 6.2
* 5.4: [HttpKernel] Account for Response::getDate() possibly returning a DateTimeImmutable [Messenger] Respect `isRetryable` decision of the retry strategy when deciding if failed message should be re-delivered
2 parents 4c39613 + d61b959 commit 670e0f3

File tree

5 files changed

+29
-7
lines changed

5 files changed

+29
-7
lines changed

src/Symfony/Component/HttpKernel/HttpCache/ResponseCacheStrategy.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,7 @@ public function update(Response $response)
148148

149149
if (is_numeric($this->ageDirectives['expires'])) {
150150
$date = clone $response->getDate();
151-
$date->modify('+'.($this->ageDirectives['expires'] + $this->age).' seconds');
151+
$date = $date->modify('+'.($this->ageDirectives['expires'] + $this->age).' seconds');
152152
$response->setExpires($date);
153153
}
154154
}

src/Symfony/Component/HttpKernel/Tests/EventListener/CacheAttributeListenerTest.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,7 @@ public function testAttributeConfigurationsAreSetOnResponse()
149149
$this->assertSame('5', $this->response->headers->getCacheControlDirective('max-stale'));
150150
$this->assertSame('6', $this->response->headers->getCacheControlDirective('stale-while-revalidate'));
151151
$this->assertSame('7', $this->response->headers->getCacheControlDirective('stale-if-error'));
152-
$this->assertInstanceOf(\DateTime::class, $this->response->getExpires());
152+
$this->assertInstanceOf(\DateTimeInterface::class, $this->response->getExpires());
153153
}
154154

155155
public function testCacheMaxAgeSupportsStrtotimeFormat()

src/Symfony/Component/HttpKernel/Tests/HttpCache/ResponseCacheStrategyTest.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -275,7 +275,7 @@ public function testCacheControlMerging(array $expects, array $master, array $su
275275

276276
case 'expires':
277277
$expires = clone $response->getDate();
278-
$expires->modify('+'.$value.' seconds');
278+
$expires = $expires->modify('+'.$value.' seconds');
279279
$response->setExpires($expires);
280280
break;
281281

src/Symfony/Component/Messenger/EventListener/SendFailedMessageForRetryListener.php

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,8 @@ public static function getSubscribedEvents(): array
117117

118118
private function shouldRetry(\Throwable $e, Envelope $envelope, RetryStrategyInterface $retryStrategy): bool
119119
{
120-
if ($e instanceof RecoverableExceptionInterface) {
120+
$isRetryable = $retryStrategy->isRetryable($envelope, $e);
121+
if ($isRetryable && $e instanceof RecoverableExceptionInterface) {
121122
return true;
122123
}
123124

@@ -126,7 +127,7 @@ private function shouldRetry(\Throwable $e, Envelope $envelope, RetryStrategyInt
126127
if ($e instanceof HandlerFailedException) {
127128
$shouldNotRetry = true;
128129
foreach ($e->getNestedExceptions() as $nestedException) {
129-
if ($nestedException instanceof RecoverableExceptionInterface) {
130+
if ($isRetryable && $nestedException instanceof RecoverableExceptionInterface) {
130131
return true;
131132
}
132133

@@ -144,7 +145,7 @@ private function shouldRetry(\Throwable $e, Envelope $envelope, RetryStrategyInt
144145
return false;
145146
}
146147

147-
return $retryStrategy->isRetryable($envelope, $e);
148+
return $isRetryable;
148149
}
149150

150151
private function getRetryStrategyForTransport(string $alias): ?RetryStrategyInterface

src/Symfony/Component/Messenger/Tests/EventListener/SendFailedMessageForRetryListenerTest.php

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ public function testRecoverableStrategyCausesRetry()
6363
$senderLocator->expects($this->once())->method('has')->willReturn(true);
6464
$senderLocator->expects($this->once())->method('get')->willReturn($sender);
6565
$retryStategy = $this->createMock(RetryStrategyInterface::class);
66-
$retryStategy->expects($this->never())->method('isRetryable');
66+
$retryStategy->expects($this->once())->method('isRetryable')->willReturn(true);
6767
$retryStategy->expects($this->once())->method('getWaitingTime')->willReturn(1000);
6868
$retryStrategyLocator = $this->createMock(ContainerInterface::class);
6969
$retryStrategyLocator->expects($this->once())->method('has')->willReturn(true);
@@ -78,6 +78,27 @@ public function testRecoverableStrategyCausesRetry()
7878
$listener->onMessageFailed($event);
7979
}
8080

81+
public function testRetryIsOnlyAllowedWhenPermittedByRetryStrategy()
82+
{
83+
$senderLocator = $this->createMock(ContainerInterface::class);
84+
$senderLocator->expects($this->never())->method('has');
85+
$senderLocator->expects($this->never())->method('get');
86+
$retryStrategy = $this->createMock(RetryStrategyInterface::class);
87+
$retryStrategy->expects($this->once())->method('isRetryable')->willReturn(false);
88+
$retryStrategy->expects($this->never())->method('getWaitingTime');
89+
$retryStrategyLocator = $this->createMock(ContainerInterface::class);
90+
$retryStrategyLocator->expects($this->once())->method('has')->willReturn(true);
91+
$retryStrategyLocator->expects($this->once())->method('get')->willReturn($retryStrategy);
92+
93+
$listener = new SendFailedMessageForRetryListener($senderLocator, $retryStrategyLocator);
94+
95+
$exception = new RecoverableMessageHandlingException('retry');
96+
$envelope = new Envelope(new \stdClass());
97+
$event = new WorkerMessageFailedEvent($envelope, 'my_receiver', $exception);
98+
99+
$listener->onMessageFailed($event);
100+
}
101+
81102
public function testEnvelopeIsSentToTransportOnRetry()
82103
{
83104
$exception = new \Exception('no!');

0 commit comments

Comments
 (0)