diff --git a/src/Symfony/Component/HttpClient/MockHttpClient.php b/src/Symfony/Component/HttpClient/MockHttpClient.php index 1d3d7b8b68172..41bb20b299f16 100644 --- a/src/Symfony/Component/HttpClient/MockHttpClient.php +++ b/src/Symfony/Component/HttpClient/MockHttpClient.php @@ -31,16 +31,16 @@ class MockHttpClient implements HttpClientInterface private $baseUri; /** - * @param callable|ResponseInterface|ResponseInterface[]|iterable $responseFactory + * @param callable|ResponseInterface|ResponseInterface[]|iterable|null $responseFactory */ - public function __construct($responseFactory, string $baseUri = null) + public function __construct($responseFactory = null, string $baseUri = null) { if ($responseFactory instanceof ResponseInterface) { $responseFactory = [$responseFactory]; } - if (!\is_callable($responseFactory) && !$responseFactory instanceof \Iterator) { - $responseFactory = (function () use ($responseFactory) { + if (null !== $responseFactory && !\is_callable($responseFactory) && !$responseFactory instanceof \Iterator) { + $responseFactory = (static function () use ($responseFactory) { yield from $responseFactory; })(); } @@ -57,7 +57,9 @@ public function request(string $method, string $url, array $options = []): Respo [$url, $options] = $this->prepareRequest($method, $url, $options, ['base_uri' => $this->baseUri], true); $url = implode('', $url); - if (\is_callable($this->responseFactory)) { + if (null === $this->responseFactory) { + $response = new MockResponse(); + } elseif (\is_callable($this->responseFactory)) { $response = ($this->responseFactory)($method, $url, $options); } elseif (!$this->responseFactory->valid()) { throw new TransportException('The response factory iterator passed to MockHttpClient is empty.'); diff --git a/src/Symfony/Component/HttpClient/Response/MockResponse.php b/src/Symfony/Component/HttpClient/Response/MockResponse.php index 1e7581a5c1f53..10b087467eaa8 100644 --- a/src/Symfony/Component/HttpClient/Response/MockResponse.php +++ b/src/Symfony/Component/HttpClient/Response/MockResponse.php @@ -111,6 +111,10 @@ public static function fromRequest(string $method, string $url, array $options, $response->info['user_data'] = $options['user_data'] ?? null; $response->info['url'] = $url; + if ($mock instanceof self) { + $mock->requestOptions = $response->requestOptions; + } + self::writeRequest($response, $options, $mock); $response->body[] = [$options, $mock]; diff --git a/src/Symfony/Component/HttpClient/ScopingHttpClient.php b/src/Symfony/Component/HttpClient/ScopingHttpClient.php index 5c8a0c411f1ab..5b1da579bc0b5 100644 --- a/src/Symfony/Component/HttpClient/ScopingHttpClient.php +++ b/src/Symfony/Component/HttpClient/ScopingHttpClient.php @@ -38,6 +38,17 @@ public function __construct(HttpClientInterface $client, array $defaultOptionsBy $this->defaultRegexp = $defaultRegexp; } + public static function forBaseUri(HttpClientInterface $client, string $baseUri, array $defaultOptions = [], $regexp = null): self + { + if (null === $regexp) { + $regexp = preg_quote(implode('', self::resolveUrl(self::parseUrl('.'), self::parseUrl($baseUri)))); + } + + $defaultOptions['base_uri'] = $baseUri; + + return new self($client, [$regexp => $defaultOptions], $regexp); + } + /** * {@inheritdoc} */ diff --git a/src/Symfony/Component/HttpClient/Tests/ScopingHttpClientTest.php b/src/Symfony/Component/HttpClient/Tests/ScopingHttpClientTest.php index 9ab34c2b1f6f8..7fe9104442327 100644 --- a/src/Symfony/Component/HttpClient/Tests/ScopingHttpClientTest.php +++ b/src/Symfony/Component/HttpClient/Tests/ScopingHttpClientTest.php @@ -14,14 +14,13 @@ use PHPUnit\Framework\TestCase; use Symfony\Component\HttpClient\Exception\InvalidArgumentException; use Symfony\Component\HttpClient\MockHttpClient; -use Symfony\Component\HttpClient\Response\MockResponse; use Symfony\Component\HttpClient\ScopingHttpClient; class ScopingHttpClientTest extends TestCase { public function testRelativeUrl() { - $mockClient = new MockHttpClient([]); + $mockClient = new MockHttpClient(); $client = new ScopingHttpClient($mockClient, []); $this->expectException(InvalidArgumentException::class); @@ -30,7 +29,7 @@ public function testRelativeUrl() public function testRelativeUrlWithDefaultRegexp() { - $mockClient = new MockHttpClient(new MockResponse()); + $mockClient = new MockHttpClient(); $client = new ScopingHttpClient($mockClient, ['.*' => ['base_uri' => 'http://example.com']], '.*'); $this->assertSame('http://example.com/foo', $client->request('GET', '/foo')->getInfo('url')); @@ -41,7 +40,7 @@ public function testRelativeUrlWithDefaultRegexp() */ public function testMatchingUrls(string $regexp, string $url, array $options) { - $mockClient = new MockHttpClient(new MockResponse()); + $mockClient = new MockHttpClient(); $client = new ScopingHttpClient($mockClient, $options); $response = $client->request('GET', $url); @@ -69,13 +68,7 @@ public function testMatchingUrlsAndOptions() '.*' => ['headers' => ['content-type' => 'text/html']], ]; - $mockResponses = [ - new MockResponse(), - new MockResponse(), - new MockResponse(), - ]; - - $mockClient = new MockHttpClient($mockResponses); + $mockClient = new MockHttpClient(); $client = new ScopingHttpClient($mockClient, $defaultOptions); $response = $client->request('GET', 'http://example.com/foo-bar', ['json' => ['url' => 'http://example.com']]); @@ -93,4 +86,16 @@ public function testMatchingUrlsAndOptions() $this->assertEquals($requestOptions['headers']['x-app'][0], 'unit-test'); $this->assertEquals($requestOptions['headers']['content-type'][0], 'text/html'); } + + public function testForBaseUri() + { + $client = ScopingHttpClient::forBaseUri(new MockHttpClient(), 'http://example.com/foo'); + + $response = $client->request('GET', '/bar'); + $this->assertSame('http://example.com/foo', implode('', $response->getRequestOptions()['base_uri'])); + $this->assertSame('http://example.com/bar', $response->getInfo('url')); + + $response = $client->request('GET', 'http://foo.bar/'); + $this->assertNull($response->getRequestOptions()['base_uri']); + } } pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy