|
13 | 13 |
|
14 | 14 | use PHPUnit\Framework\TestCase;
|
15 | 15 | use Symfony\Component\HttpClient\Exception\ServerException;
|
16 |
| -use Symfony\Component\HttpClient\Exception\TimeoutException; |
| 16 | +use Symfony\Component\HttpClient\Exception\TransportException; |
17 | 17 | use Symfony\Component\HttpClient\HttpClient;
|
18 | 18 | use Symfony\Component\HttpClient\MockHttpClient;
|
19 | 19 | use Symfony\Component\HttpClient\NativeHttpClient;
|
20 | 20 | use Symfony\Component\HttpClient\Response\AsyncContext;
|
21 | 21 | use Symfony\Component\HttpClient\Response\MockResponse;
|
22 | 22 | use Symfony\Component\HttpClient\Retry\GenericRetryStrategy;
|
| 23 | +use Symfony\Component\HttpClient\Retry\RetryStrategyInterface; |
23 | 24 | use Symfony\Component\HttpClient\RetryableHttpClient;
|
24 | 25 | use Symfony\Contracts\HttpClient\Exception\TransportExceptionInterface;
|
25 | 26 | use Symfony\Contracts\HttpClient\Test\TestHttpServer;
|
@@ -247,32 +248,36 @@ public function testRetryOnErrorAssertContent()
|
247 | 248 | self::assertSame('Test out content', $response->getContent(), 'Content should be buffered');
|
248 | 249 | }
|
249 | 250 |
|
250 |
| - /** |
251 |
| - * @testWith ["GET"] |
252 |
| - * ["POST"] |
253 |
| - * ["PUT"] |
254 |
| - * ["PATCH"] |
255 |
| - * ["DELETE"] |
256 |
| - */ |
257 |
| - public function testRetryOnHeaderTimeout(string $method) |
| 251 | + public function testRetryOnTimeout() |
258 | 252 | {
|
259 | 253 | $client = HttpClient::create();
|
260 | 254 |
|
261 |
| - if ($client instanceof NativeHttpClient) { |
262 |
| - $this->markTestSkipped('NativeHttpClient cannot timeout before receiving headers'); |
263 |
| - } |
264 |
| - |
265 | 255 | TestHttpServer::start();
|
266 | 256 |
|
267 |
| - $client = new RetryableHttpClient($client); |
268 |
| - $response = $client->request($method, 'http://localhost:8057/timeout-header', ['timeout' => 0.1]); |
| 257 | + $strategy = new class() implements RetryStrategyInterface { |
| 258 | + public $isCalled = false; |
| 259 | + |
| 260 | + public function shouldRetry(AsyncContext $context, ?string $responseContent, ?TransportExceptionInterface $exception): ?bool |
| 261 | + { |
| 262 | + $this->isCalled = true; |
| 263 | + |
| 264 | + return false; |
| 265 | + } |
| 266 | + |
| 267 | + public function getDelay(AsyncContext $context, ?string $responseContent, ?TransportExceptionInterface $exception): int |
| 268 | + { |
| 269 | + return 0; |
| 270 | + } |
| 271 | + }; |
| 272 | + $client = new RetryableHttpClient($client, $strategy); |
| 273 | + $response = $client->request('GET', 'http://localhost:8057/timeout-header', ['timeout' => 0.1]); |
269 | 274 |
|
270 | 275 | try {
|
271 | 276 | $response->getStatusCode();
|
272 |
| - $this->fail(TimeoutException::class.' expected'); |
273 |
| - } catch (TimeoutException $e) { |
| 277 | + $this->fail(TransportException::class.' expected'); |
| 278 | + } catch (TransportException $e) { |
274 | 279 | }
|
275 | 280 |
|
276 |
| - $this->assertSame('Idle timeout reached for "http://localhost:8057/timeout-header".', $response->getInfo('error')); |
| 281 | + $this->assertTrue($strategy->isCalled, 'The HTTP retry strategy should be called'); |
277 | 282 | }
|
278 | 283 | }
|
0 commit comments