From f872d8fef38da5051e10ffaffcd34bf4b116b8f8 Mon Sep 17 00:00:00 2001 From: Maximilian Ruta Date: Sun, 10 May 2020 16:25:33 +0200 Subject: [PATCH 1/3] 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 bcf0152875a246414bb31f03efa623e9d04cfbb3 Mon Sep 17 00:00:00 2001 From: Maximilian Ruta Date: Sun, 10 May 2020 16:28:33 +0200 Subject: [PATCH 2/3] Add fake support for StreamedResponse --- src/RequestHandler.php | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/src/RequestHandler.php b/src/RequestHandler.php index d8be990..a434971 100644 --- a/src/RequestHandler.php +++ b/src/RequestHandler.php @@ -34,6 +34,7 @@ use React\Http\Io\HttpBodyStream; use function React\Promise\all; use React\Promise\FulfilledPromise; +use React\Promise\Promise; use function React\Promise\resolve; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Message\StreamInterface; @@ -43,11 +44,13 @@ use React\Promise\PromiseInterface; use React\Stream\ReadableStreamInterface; use React\Stream\ThroughStream; +use RingCentral\Psr7\BufferStream; 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; +use Symfony\Component\HttpFoundation\StreamedResponse; use Symfony\Component\Routing\Exception\RouteNotFoundException; use Throwable; @@ -275,6 +278,26 @@ private function toServerResponse( $streamPromise = $this->filesystem->file($response->getFile()->getPathname())->open('r')->then(function (ReadableStreamInterface $stream) { return new HttpBodyStream($stream, null); }); + } elseif($response instanceof StreamedResponse) { + $streamPromise = new Promise(function($resolve, $reject) use($response) { + $stream = new BufferStream(); + $resolve($stream); + ob_start(function($data) use($stream, $resolve, &$isResolved) { + $stream->write($data); + }, 1); + $response->sendContent(); + ob_end_flush(); + }); + } elseif($response instanceof StreamedResponse) { + $streamPromise = new Promise(function($resolve, $reject) use($response) { + $stream = new BufferStream(); + $resolve($stream); + ob_start(function($data) use($stream, $resolve, &$isResolved) { + $stream->write($data); + }, 1); + $response->sendContent(); + ob_end_flush(); + }); } else { $streamPromise = new FulfilledPromise($response->getContent()); } From 32510a0993294c2d4011e89f91c561d8dbd1ebcc Mon Sep 17 00:00:00 2001 From: Maximilian Ruta Date: Thu, 6 Aug 2020 12:14:22 +0200 Subject: [PATCH 3/3] Removed duplicate block --- src/RequestHandler.php | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/src/RequestHandler.php b/src/RequestHandler.php index a434971..481a93d 100644 --- a/src/RequestHandler.php +++ b/src/RequestHandler.php @@ -288,16 +288,6 @@ private function toServerResponse( $response->sendContent(); ob_end_flush(); }); - } elseif($response instanceof StreamedResponse) { - $streamPromise = new Promise(function($resolve, $reject) use($response) { - $stream = new BufferStream(); - $resolve($stream); - ob_start(function($data) use($stream, $resolve, &$isResolved) { - $stream->write($data); - }, 1); - $response->sendContent(); - ob_end_flush(); - }); } else { $streamPromise = new FulfilledPromise($response->getContent()); }