diff --git a/src/Symfony/Component/HttpClient/Response/AsyncResponse.php b/src/Symfony/Component/HttpClient/Response/AsyncResponse.php index d423ba39edc8d..ae0d004f7651b 100644 --- a/src/Symfony/Component/HttpClient/Response/AsyncResponse.php +++ b/src/Symfony/Component/HttpClient/Response/AsyncResponse.php @@ -65,7 +65,7 @@ public function __construct(HttpClientInterface $client, string $method, string while (true) { foreach (self::stream([$response], $timeout) as $chunk) { if ($chunk->isTimeout() && $response->passthru) { - foreach (self::passthru($response->client, $response, new ErrorChunk($response->offset, new TransportException($chunk->getError()))) as $chunk) { + foreach (self::passthru($response->client, $response, new ErrorChunk($response->offset, $chunk->getError())) as $chunk) { if ($chunk->isFirst()) { return false; } @@ -123,9 +123,6 @@ public function getInfo(?string $type = null) return $this->info + $this->response->getInfo(); } - /** - * {@inheritdoc} - */ public function toStream(bool $throw = true) { if ($throw) { @@ -146,9 +143,6 @@ public function toStream(bool $throw = true) return $stream; } - /** - * {@inheritdoc} - */ public function cancel(): void { if ($this->info['canceled']) { diff --git a/src/Symfony/Component/HttpClient/Tests/RetryableHttpClientTest.php b/src/Symfony/Component/HttpClient/Tests/RetryableHttpClientTest.php index cf2af1560c345..0e4befafcf4fb 100644 --- a/src/Symfony/Component/HttpClient/Tests/RetryableHttpClientTest.php +++ b/src/Symfony/Component/HttpClient/Tests/RetryableHttpClientTest.php @@ -13,6 +13,7 @@ use PHPUnit\Framework\TestCase; use Symfony\Component\HttpClient\Exception\ServerException; +use Symfony\Component\HttpClient\Exception\TimeoutException; use Symfony\Component\HttpClient\HttpClient; use Symfony\Component\HttpClient\MockHttpClient; use Symfony\Component\HttpClient\NativeHttpClient; @@ -21,6 +22,7 @@ use Symfony\Component\HttpClient\Retry\GenericRetryStrategy; use Symfony\Component\HttpClient\RetryableHttpClient; use Symfony\Contracts\HttpClient\Exception\TransportExceptionInterface; +use Symfony\Contracts\HttpClient\Test\TestHttpServer; class RetryableHttpClientTest extends TestCase { @@ -244,4 +246,33 @@ public function testRetryOnErrorAssertContent() self::assertSame('Test out content', $response->getContent()); self::assertSame('Test out content', $response->getContent(), 'Content should be buffered'); } + + /** + * @testWith ["GET"] + * ["POST"] + * ["PUT"] + * ["PATCH"] + * ["DELETE"] + */ + public function testRetryOnHeaderTimeout(string $method) + { + $client = HttpClient::create(); + + if ($client instanceof NativeHttpClient) { + $this->markTestSkipped('NativeHttpClient cannot timeout before receiving headers'); + } + + TestHttpServer::start(); + + $client = new RetryableHttpClient($client); + $response = $client->request($method, 'http://localhost:8057/timeout-header', ['timeout' => 0.1]); + + try { + $response->getStatusCode(); + $this->fail(TimeoutException::class.' expected'); + } catch (TimeoutException $e) { + } + + $this->assertSame('Idle timeout reached for "http://localhost:8057/timeout-header".', $response->getInfo('error')); + } }