Skip to content

Commit ab236d6

Browse files
[HttpClient] add TimeoutExceptionInterface
1 parent 52c52a8 commit ab236d6

File tree

7 files changed

+68
-25
lines changed

7 files changed

+68
-25
lines changed

src/Symfony/Component/HttpClient/Chunk/ErrorChunk.php

+6-5
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111

1212
namespace Symfony\Component\HttpClient\Chunk;
1313

14+
use Symfony\Component\HttpClient\Exception\TimeoutException;
1415
use Symfony\Component\HttpClient\Exception\TransportException;
1516
use Symfony\Contracts\HttpClient\ChunkInterface;
1617

@@ -61,7 +62,7 @@ public function isTimeout(): bool
6162
public function isFirst(): bool
6263
{
6364
$this->didThrow = true;
64-
throw new TransportException($this->errorMessage, 0, $this->error);
65+
throw null !== $this->error ? new TransportException($this->errorMessage, 0, $this->error) : new TimeoutException($this->errorMessage);
6566
}
6667

6768
/**
@@ -70,7 +71,7 @@ public function isFirst(): bool
7071
public function isLast(): bool
7172
{
7273
$this->didThrow = true;
73-
throw new TransportException($this->errorMessage, 0, $this->error);
74+
throw null !== $this->error ? new TransportException($this->errorMessage, 0, $this->error) : new TimeoutException($this->errorMessage);
7475
}
7576

7677
/**
@@ -79,7 +80,7 @@ public function isLast(): bool
7980
public function getInformationalStatus(): ?array
8081
{
8182
$this->didThrow = true;
82-
throw new TransportException($this->errorMessage, 0, $this->error);
83+
throw null !== $this->error ? new TransportException($this->errorMessage, 0, $this->error) : new TimeoutException($this->errorMessage);
8384
}
8485

8586
/**
@@ -88,7 +89,7 @@ public function getInformationalStatus(): ?array
8889
public function getContent(): string
8990
{
9091
$this->didThrow = true;
91-
throw new TransportException($this->errorMessage, 0, $this->error);
92+
throw null !== $this->error ? new TransportException($this->errorMessage, 0, $this->error) : new TimeoutException($this->errorMessage);
9293
}
9394

9495
/**
@@ -119,7 +120,7 @@ public function __destruct()
119120
{
120121
if (!$this->didThrow) {
121122
$this->didThrow = true;
122-
throw new TransportException($this->errorMessage, 0, $this->error);
123+
throw null !== $this->error ? new TransportException($this->errorMessage, 0, $this->error) : new TimeoutException($this->errorMessage);
123124
}
124125
}
125126
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
<?php
2+
3+
/*
4+
* This file is part of the Symfony package.
5+
*
6+
* (c) Fabien Potencier <fabien@symfony.com>
7+
*
8+
* For the full copyright and license information, please view the LICENSE
9+
* file that was distributed with this source code.
10+
*/
11+
12+
namespace Symfony\Component\HttpClient\Exception;
13+
14+
use Symfony\Contracts\HttpClient\Exception\TimeoutExceptionInterface;
15+
16+
/**
17+
* @author Nicolas Grekas <p@tchwork.com>
18+
*/
19+
final class TimeoutException extends TransportException implements TimeoutExceptionInterface
20+
{
21+
}

src/Symfony/Component/HttpClient/Exception/TransportException.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,6 @@
1616
/**
1717
* @author Nicolas Grekas <p@tchwork.com>
1818
*/
19-
final class TransportException extends \RuntimeException implements TransportExceptionInterface
19+
class TransportException extends \RuntimeException implements TransportExceptionInterface
2020
{
2121
}

src/Symfony/Component/HttpClient/Tests/HttpClientTestCase.php

-18
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@
1212
namespace Symfony\Component\HttpClient\Tests;
1313

1414
use Symfony\Component\HttpClient\Exception\ClientException;
15-
use Symfony\Component\HttpClient\Exception\TransportException;
1615
use Symfony\Component\HttpClient\Response\StreamWrapper;
1716
use Symfony\Component\Process\Exception\ProcessFailedException;
1817
use Symfony\Component\Process\Process;
@@ -105,23 +104,6 @@ public function testNonBlockingStream()
105104
$this->assertTrue(feof($stream));
106105
}
107106

108-
public function testTimeoutIsNotAFatalError()
109-
{
110-
$client = $this->getHttpClient(__FUNCTION__);
111-
$response = $client->request('GET', 'http://localhost:8057/timeout-body', [
112-
'timeout' => 0.1,
113-
]);
114-
115-
try {
116-
$response->getContent();
117-
$this->fail(TransportException::class.' expected');
118-
} catch (TransportException $e) {
119-
}
120-
121-
usleep(400000);
122-
$this->assertSame('<1><2>', $response->getContent());
123-
}
124-
125107
public function testResponseStreamRewind()
126108
{
127109
$client = $this->getHttpClient(__FUNCTION__);

src/Symfony/Component/HttpClient/composer.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
"require": {
2424
"php": "^7.2.5",
2525
"psr/log": "^1.0",
26-
"symfony/http-client-contracts": "^1.1.8|^2",
26+
"symfony/http-client-contracts": "^2.1.1",
2727
"symfony/polyfill-php73": "^1.11",
2828
"symfony/polyfill-php80": "^1.15",
2929
"symfony/service-contracts": "^1.0|^2"
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
<?php
2+
3+
/*
4+
* This file is part of the Symfony package.
5+
*
6+
* (c) Fabien Potencier <fabien@symfony.com>
7+
*
8+
* For the full copyright and license information, please view the LICENSE
9+
* file that was distributed with this source code.
10+
*/
11+
12+
namespace Symfony\Contracts\HttpClient\Exception;
13+
14+
/**
15+
* When an idle timeout occurs.
16+
*
17+
* @author Nicolas Grekas <p@tchwork.com>
18+
*/
19+
interface TimeoutExceptionInterface extends TransportExceptionInterface
20+
{
21+
}

src/Symfony/Contracts/HttpClient/Test/HttpClientTestCase.php

+18
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
use PHPUnit\Framework\TestCase;
1515
use Symfony\Contracts\HttpClient\Exception\ClientExceptionInterface;
1616
use Symfony\Contracts\HttpClient\Exception\RedirectionExceptionInterface;
17+
use Symfony\Contracts\HttpClient\Exception\TimeoutExceptionInterface;
1718
use Symfony\Contracts\HttpClient\Exception\TransportExceptionInterface;
1819
use Symfony\Contracts\HttpClient\HttpClientInterface;
1920

@@ -739,6 +740,23 @@ public function testTimeoutOnAccess()
739740
$response->getHeaders();
740741
}
741742

743+
public function testTimeoutIsNotAFatalError()
744+
{
745+
$client = $this->getHttpClient(__FUNCTION__);
746+
$response = $client->request('GET', 'http://localhost:8057/timeout-body', [
747+
'timeout' => 0.3,
748+
]);
749+
750+
try {
751+
$response->getContent();
752+
$this->fail(TimeoutExceptionInterface::class.' expected');
753+
} catch (TimeoutExceptionInterface $e) {
754+
}
755+
756+
usleep(300000);
757+
$this->assertSame('<1><2>', $response->getContent());
758+
}
759+
742760
public function testTimeoutOnStream()
743761
{
744762
usleep(300000); // wait for the previous test to release the server

0 commit comments

Comments
 (0)