diff --git a/composer.json b/composer.json index ade7829..334294e 100644 --- a/composer.json +++ b/composer.json @@ -51,6 +51,7 @@ "phpstan": "phpstan analyse -c phpstan.neon --no-progress" }, "suggest": { + "ecodev/graphql-upload": "If you want to support file upload inside GraphQL input types (v7/v8)", "symfony/security-bundle": "To use #[Logged] or #[Right] attributes" }, "autoload" : { diff --git a/src/Controller/GraphQLiteController.php b/src/Controller/GraphQLiteController.php index f5fe84c..a294c80 100644 --- a/src/Controller/GraphQLiteController.php +++ b/src/Controller/GraphQLiteController.php @@ -7,7 +7,10 @@ use Laminas\Diactoros\ServerRequestFactory; use Laminas\Diactoros\StreamFactory; use Laminas\Diactoros\UploadedFileFactory; +use LogicException; use Symfony\Bridge\PsrHttpMessage\Factory\PsrHttpFactory; +use TheCodingMachine\GraphQLite\Bundle\UploadMiddlewareUtils\DummyResponseWithRequest; +use TheCodingMachine\GraphQLite\Bundle\UploadMiddlewareUtils\RequestExtractorMiddleware; use TheCodingMachine\GraphQLite\Http\HttpCodeDecider; use TheCodingMachine\GraphQLite\Http\HttpCodeDeciderInterface; use GraphQL\Executor\ExecutionResult; @@ -27,27 +30,18 @@ use function array_map; use function class_exists; +use function get_debug_type; use function json_decode; /** - * Listens to every single request and forward Graphql requests to Graphql Webonix standardServer. + * Listens to every single request and forwards GraphQL requests to Webonyx's {@see \GraphQL\Server\StandardServer}. */ class GraphQLiteController { - /** - * @var HttpMessageFactoryInterface - */ - private $httpMessageFactory; - /** @var int */ - private $debug; - /** - * @var ServerConfig - */ - private $serverConfig; - /** - * @var HttpCodeDeciderInterface - */ - private $httpCodeDecider; + private HttpMessageFactoryInterface $httpMessageFactory; + private int $debug; + private ServerConfig $serverConfig; + private HttpCodeDeciderInterface $httpCodeDecider; public function __construct(ServerConfig $serverConfig, ?HttpMessageFactoryInterface $httpMessageFactory = null, ?int $debug = null, ?HttpCodeDeciderInterface $httpCodeDecider = null) { @@ -98,11 +92,14 @@ public function handleRequest(Request $request): Response $psr7Request = $psr7Request->withParsedBody($parsedBody); } - // Let's parse the request and adapt it for file uploads. + // Let's parse the request and adapt it for file uploads by extracting it from the middleware. if (class_exists(UploadMiddleware::class)) { $uploadMiddleware = new UploadMiddleware(); - $psr7Request = $uploadMiddleware->processRequest($psr7Request); - \assert($psr7Request instanceof ServerRequestInterface); + $dummyResponseWithRequest = $uploadMiddleware->process($psr7Request, new RequestExtractorMiddleware()); + if (! $dummyResponseWithRequest instanceof DummyResponseWithRequest) { + throw new LogicException(DummyResponseWithRequest::class . ' expect, got ' . get_debug_type($dummyResponseWithRequest)); + } + $psr7Request = $dummyResponseWithRequest->getRequest(); } return $this->handlePsr7Request($psr7Request, $request); diff --git a/src/UploadMiddlewareUtils/DummyResponseWithRequest.php b/src/UploadMiddlewareUtils/DummyResponseWithRequest.php new file mode 100644 index 0000000..a5a389b --- /dev/null +++ b/src/UploadMiddlewareUtils/DummyResponseWithRequest.php @@ -0,0 +1,27 @@ +request = $request; + } + + public function getRequest(): ServerRequestInterface + { + return $this->request; + } +} diff --git a/src/UploadMiddlewareUtils/RequestExtractorMiddleware.php b/src/UploadMiddlewareUtils/RequestExtractorMiddleware.php new file mode 100644 index 0000000..ce17ba5 --- /dev/null +++ b/src/UploadMiddlewareUtils/RequestExtractorMiddleware.php @@ -0,0 +1,21 @@ +