diff --git a/src/Symfony/Component/HttpClient/Response/MockResponse.php b/src/Symfony/Component/HttpClient/Response/MockResponse.php index dc65a49fa96c6..b8954e6732cd3 100644 --- a/src/Symfony/Component/HttpClient/Response/MockResponse.php +++ b/src/Symfony/Component/HttpClient/Response/MockResponse.php @@ -90,17 +90,11 @@ public function getRequestMethod(): string return $this->requestMethod; } - /** - * {@inheritdoc} - */ public function getInfo(?string $type = null) { return null !== $type ? $this->info[$type] ?? null : $this->info; } - /** - * {@inheritdoc} - */ public function cancel(): void { $this->info['canceled'] = true; @@ -116,9 +110,6 @@ public function cancel(): void $onProgress($this->offset, $dlSize, $this->info); } - /** - * {@inheritdoc} - */ protected function close(): void { $this->inflate = null; @@ -159,9 +150,6 @@ public static function fromRequest(string $method, string $url, array $options, return $response; } - /** - * {@inheritdoc} - */ protected static function schedule(self $response, array &$runningResponses): void { if (!$response->id) { @@ -177,9 +165,6 @@ protected static function schedule(self $response, array &$runningResponses): vo $runningResponses[0][1][$response->id] = $response; } - /** - * {@inheritdoc} - */ protected static function perform(ClientState $multi, array &$responses): void { foreach ($responses as $response) { @@ -203,7 +188,7 @@ protected static function perform(ClientState $multi, array &$responses): void $chunk[1]->getStatusCode(); $chunk[1]->getHeaders(false); self::readResponse($response, $chunk[0], $chunk[1], $offset); - $multi->handlesActivity[$id][] = new FirstChunk(); + $multi->handlesActivity[$id][] = ($response->body[0] ?? null) instanceof ErrorChunk ? $response->body[0] : new FirstChunk(); $buffer = $response->requestOptions['buffer'] ?? null; if ($buffer instanceof \Closure && $response->content = $buffer($response->headers) ?: null) { @@ -223,9 +208,6 @@ protected static function perform(ClientState $multi, array &$responses): void } } - /** - * {@inheritdoc} - */ protected static function select(ClientState $multi, float $timeout): int { return 42; diff --git a/src/Symfony/Component/HttpClient/Tests/Response/MockResponseTest.php b/src/Symfony/Component/HttpClient/Tests/Response/MockResponseTest.php index 0afac4ec74722..75792e2882fd4 100644 --- a/src/Symfony/Component/HttpClient/Tests/Response/MockResponseTest.php +++ b/src/Symfony/Component/HttpClient/Tests/Response/MockResponseTest.php @@ -13,6 +13,7 @@ use PHPUnit\Framework\TestCase; use Symfony\Component\HttpClient\Exception\JsonException; +use Symfony\Component\HttpClient\Exception\TimeoutException; use Symfony\Component\HttpClient\Exception\TransportException; use Symfony\Component\HttpClient\Response\MockResponse; @@ -124,4 +125,34 @@ public function testCancelingAMockResponseNotIssuedByMockHttpClient() $this->assertTrue($mockResponse->getInfo('canceled')); } + + public function testTimeoutHeader() + { + $response = MockResponse::fromRequest('GET', 'http://symfony.com', [], new MockResponse([''])); + + try { + $response->getStatusCode(); + $this->fail(TimeoutException::class.' expected'); + } catch (TimeoutException $e) { + } + + $this->assertSame('Idle timeout reached for "http://symfony.com".', $response->getInfo('error')); + } + + public function testTimeoutBody() + { + $response = MockResponse::fromRequest('GET', 'http://symfony.com', [], new MockResponse(['content', ''])); + + try { + $this->assertSame(200, $response->getStatusCode()); + } catch (TimeoutException $e) { + $this->fail(TimeoutException::class.' was not expected'); + } + + try { + $response->getContent(); + $this->fail(TimeoutException::class.' expected'); + } catch (TimeoutException $e) { + } + } }