From f872d8fef38da5051e10ffaffcd34bf4b116b8f8 Mon Sep 17 00:00:00 2001 From: Maximilian Ruta Date: Sun, 10 May 2020 16:25:33 +0200 Subject: [PATCH 1/2] Add support for BinaryFileResponse --- src/RequestHandler.php | 71 ++++++++++++++++++++++++++---------------- 1 file changed, 44 insertions(+), 27 deletions(-) diff --git a/src/RequestHandler.php b/src/RequestHandler.php index d5f0efb..d8be990 100644 --- a/src/RequestHandler.php +++ b/src/RequestHandler.php @@ -31,7 +31,9 @@ use Drift\Console\TimeFormatter; use Drift\HttpKernel\AsyncKernel; use Drift\Server\Mime\MimeTypeChecker; +use React\Http\Io\HttpBodyStream; use function React\Promise\all; +use React\Promise\FulfilledPromise; use function React\Promise\resolve; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Message\StreamInterface; @@ -42,6 +44,7 @@ use React\Stream\ReadableStreamInterface; use React\Stream\ThroughStream; use RingCentral\Psr7\Response as PSRResponse; +use Symfony\Component\HttpFoundation\BinaryFileResponse; use Symfony\Component\HttpFoundation\File\UploadedFile as SymfonyUploadedFile; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; @@ -268,35 +271,49 @@ private function toServerResponse( float $from ): PromiseInterface { if ($response instanceof Response) { - $response = new PSRResponse( - $response->getStatusCode(), - $response->headers->all(), - $response->getContent() - ); + if ($response instanceof BinaryFileResponse) { + $streamPromise = $this->filesystem->file($response->getFile()->getPathname())->open('r')->then(function (ReadableStreamInterface $stream) { + return new HttpBodyStream($stream, null); + }); + } else { + $streamPromise = new FulfilledPromise($response->getContent()); + } + + $responsePromise = $streamPromise->then(function ($stream) use($response) { + return new PSRResponse( + $response->getStatusCode(), + $response->headers->all(), + $stream + ); + }); + } else { + $responsePromise = new FulfilledPromise($response); } - return $this - ->applyResponseEncoding($response, $symfonyRequest->headers->get('Accept-Encoding')) - ->then(function (PSRResponse $response) use ($symfonyRequest, $from) { - $to = microtime(true); - $serverResponse = - new ServerResponseWithMessage( - $response, - $this->outputPrinter, - new ConsoleRequestMessage( - $symfonyRequest->getPathInfo(), - $symfonyRequest->getMethod(), - $response->getStatusCode(), - '', - TimeFormatter::formatTime($to - $from) - ) - ); - - $symfonyRequest = null; - $symfonyResponse = null; - - return $serverResponse; - }); + return $responsePromise->then(function (PSRResponse $response) use ($symfonyRequest, $from) { + return $this + ->applyResponseEncoding($response, $symfonyRequest->headers->get('Accept-Encoding')) + ->then(function (PSRResponse $response) use ($symfonyRequest, $from) { + $to = microtime(true); + $serverResponse = + new ServerResponseWithMessage( + $response, + $this->outputPrinter, + new ConsoleRequestMessage( + $symfonyRequest->getPathInfo(), + $symfonyRequest->getMethod(), + $response->getStatusCode(), + '', + TimeFormatter::formatTime($to - $from) + ) + ); + + $symfonyRequest = null; + $symfonyResponse = null; + + return $serverResponse; + }); + }); } /** From 20ed86fd0319c6b8c8d865a6eca67c6c63aa0115 Mon Sep 17 00:00:00 2001 From: Maximilian Ruta Date: Thu, 26 Nov 2020 18:27:54 +0100 Subject: [PATCH 2/2] remove duplicate use --- src/RequestHandler.php | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/RequestHandler.php b/src/RequestHandler.php index 621da78..a8f9fb8 100644 --- a/src/RequestHandler.php +++ b/src/RequestHandler.php @@ -41,9 +41,7 @@ use Psr\Http\Message\UploadedFileInterface as PsrUploadedFile; use React\Filesystem\FilesystemInterface; use React\Http\Message\Response as ReactResponse; -use function React\Promise\all; use React\Promise\PromiseInterface; -use function React\Promise\resolve; use React\Stream\ReadableStreamInterface; use React\Stream\ThroughStream; use RingCentral\Psr7\Response as PSRResponse;