Skip to content

Commit 494b458

Browse files
Merge branch '5.4' into 6.0
* 5.4: [HttpClient] Fix computing retry delay when using RetryableHttpClient [Uid] Fix validating UUID variant bits [Validator][UID] Stop to first ULID format violation [Bridge] Fix mkdir() race condition in ProxyCacheWarmer [Cache] update readme Bug #42343 [Security] Fix valid remember-me token exposure to the second consequent request Prevent exception if request stack is empty Psr18Client ignore invalid HTTP headers skip a transient test on AppVeyor
2 parents 411f73a + 5fee724 commit 494b458

File tree

4 files changed

+64
-2
lines changed

4 files changed

+64
-2
lines changed

Psr18Client.php

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,11 @@ public function sendRequest(RequestInterface $request): ResponseInterface
101101

102102
foreach ($response->getHeaders(false) as $name => $values) {
103103
foreach ($values as $value) {
104-
$psrResponse = $psrResponse->withAddedHeader($name, $value);
104+
try {
105+
$psrResponse = $psrResponse->withAddedHeader($name, $value);
106+
} catch (\InvalidArgumentException $e) {
107+
// ignore invalid header
108+
}
105109
}
106110
}
107111

RetryableHttpClient.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,7 @@ private function getDelayFromHeader(array $headers): ?int
138138
{
139139
if (null !== $after = $headers['retry-after'][0] ?? null) {
140140
if (is_numeric($after)) {
141-
return (int) $after * 1000;
141+
return (int) ($after * 1000);
142142
}
143143

144144
if (false !== $time = strtotime($after)) {

Tests/Psr18ClientTest.php

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,12 @@
1313

1414
use Nyholm\Psr7\Factory\Psr17Factory;
1515
use PHPUnit\Framework\TestCase;
16+
use Symfony\Component\HttpClient\MockHttpClient;
1617
use Symfony\Component\HttpClient\NativeHttpClient;
1718
use Symfony\Component\HttpClient\Psr18Client;
1819
use Symfony\Component\HttpClient\Psr18NetworkException;
1920
use Symfony\Component\HttpClient\Psr18RequestException;
21+
use Symfony\Component\HttpClient\Response\MockResponse;
2022
use Symfony\Contracts\HttpClient\Test\TestHttpServer;
2123

2224
class Psr18ClientTest extends TestCase
@@ -81,4 +83,22 @@ public function test404()
8183
$response = $client->sendRequest($factory->createRequest('GET', 'http://localhost:8057/404'));
8284
$this->assertSame(404, $response->getStatusCode());
8385
}
86+
87+
public function testInvalidHeaderResponse()
88+
{
89+
$responseHeaders = [
90+
// space in header name not allowed in RFC 7230
91+
' X-XSS-Protection' => '0',
92+
'Cache-Control' => 'no-cache',
93+
];
94+
$response = new MockResponse('body', ['response_headers' => $responseHeaders]);
95+
$this->assertArrayHasKey(' x-xss-protection', $response->getHeaders());
96+
97+
$client = new Psr18Client(new MockHttpClient($response));
98+
$request = $client->createRequest('POST', 'http://localhost:8057/post')
99+
->withBody($client->createStream('foo=0123456789'));
100+
101+
$resultResponse = $client->sendRequest($request);
102+
$this->assertCount(1, $resultResponse->getHeaders());
103+
}
84104
}

Tests/RetryableHttpClientTest.php

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -187,4 +187,42 @@ public function testCancelOnTimeout()
187187
$response->cancel();
188188
}
189189
}
190+
191+
public function testRetryWithDelay()
192+
{
193+
$retryAfter = '0.46';
194+
195+
$client = new RetryableHttpClient(
196+
new MockHttpClient([
197+
new MockResponse('', [
198+
'http_code' => 503,
199+
'response_headers' => [
200+
'retry-after' => $retryAfter,
201+
],
202+
]),
203+
new MockResponse('', [
204+
'http_code' => 200,
205+
]),
206+
]),
207+
new GenericRetryStrategy(),
208+
1,
209+
$logger = new class() extends TestLogger {
210+
public array $context = [];
211+
212+
public function log($level, $message, array $context = []): void
213+
{
214+
$this->context = $context;
215+
parent::log($level, $message, $context);
216+
}
217+
},
218+
);
219+
220+
$client->request('GET', 'http://example.com/foo-bar')->getContent();
221+
222+
$delay = $logger->context['delay'] ?? null;
223+
224+
$this->assertArrayHasKey('delay', $logger->context);
225+
$this->assertNotNull($delay);
226+
$this->assertSame((int) ($retryAfter * 1000), $delay);
227+
}
190228
}

0 commit comments

Comments
 (0)