diff --git a/src/Client/Http/RequestFactory.php b/src/Client/Http/RequestFactory.php index e2b4a12..4123595 100644 --- a/src/Client/Http/RequestFactory.php +++ b/src/Client/Http/RequestFactory.php @@ -7,8 +7,11 @@ use Psr\Http\Message\RequestFactoryInterface; use Psr\Http\Message\RequestInterface; use Psr\Http\Message\StreamFactoryInterface; +use Psr\Http\Message\UriFactoryInterface; +use Psr\Http\Message\UriInterface; use function http_build_query; +use function is_string; use const PHP_QUERY_RFC3986; @@ -17,6 +20,8 @@ final class RequestFactory public function __construct( private RequestFactoryInterface $requestFactory, private StreamFactoryInterface $streamFactory, + private UriFactoryInterface|null $uriFactory = null, + private UriInterface|string $uri = '', ) { } @@ -29,7 +34,20 @@ public function prepareRequest(RequestOptions $requestOptions): RequestInterface PHP_QUERY_RFC3986, ); - return $this->requestFactory->createRequest('POST', $query === '' ? '' : '?' . $query) + if ($this->uriFactory === null) { + return $this->requestFactory->createRequest('POST', $query === '' ? '' : '?' . $query) + ->withBody($this->streamFactory->createStream($requestOptions->sql)); + } + + $uri = $this->uri; + if (is_string($uri)) { + $uri = $this->uriFactory->createUri($uri); + } + + $uriQuery = $uri->getQuery(); + $uri = $uri->withQuery($uriQuery . ($uriQuery !== '' && $query !== '' ? '&' : '') . $query); + + return $this->requestFactory->createRequest('POST', $uri) ->withBody($this->streamFactory->createStream($requestOptions->sql)); } } diff --git a/tests/Client/Http/RequestFactoryTest.php b/tests/Client/Http/RequestFactoryTest.php index a6fea71..04cd31b 100644 --- a/tests/Client/Http/RequestFactoryTest.php +++ b/tests/Client/Http/RequestFactoryTest.php @@ -15,7 +15,12 @@ final class RequestFactoryTest extends TestCaseBase public function testPrepareRequest(): void { $psr17Factory = new Psr17Factory(); - $requestFactory = new RequestFactory($psr17Factory, $psr17Factory); + $requestFactory = new RequestFactory( + $psr17Factory, + $psr17Factory, + $psr17Factory, + 'http://localhost:8123?format=JSON', + ); $request = $requestFactory->prepareRequest(new RequestOptions( 'SELECT 1', @@ -24,7 +29,10 @@ public function testPrepareRequest(): void )); self::assertSame('POST', $request->getMethod()); - self::assertSame('?database=database&max_block_size=1', $request->getUri()->__toString()); + self::assertSame( + 'http://localhost:8123?format=JSON&database=database&max_block_size=1', + $request->getUri()->__toString(), + ); self::assertSame('SELECT 1', $request->getBody()->__toString()); } }