* * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Bridge\PsrHttpMessage\Factory; @trigger_error(sprintf('The "%s" class is deprecated since symfony/psr-http-message-bridge 1.2, use PsrHttpFactory instead.', DiactorosFactory::class), E_USER_DEPRECATED); use Psr\Http\Message\UploadedFileInterface; use Symfony\Bridge\PsrHttpMessage\HttpMessageFactoryInterface; use Symfony\Component\HttpFoundation\BinaryFileResponse; use Symfony\Component\HttpFoundation\File\UploadedFile; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpFoundation\StreamedResponse; use Zend\Diactoros\Response as DiactorosResponse; use Zend\Diactoros\ServerRequest; use Zend\Diactoros\ServerRequestFactory as DiactorosRequestFactory; use Zend\Diactoros\Stream as DiactorosStream; use Zend\Diactoros\UploadedFile as DiactorosUploadedFile; /** * Builds Psr\HttpMessage instances using the Zend Diactoros implementation. * * @author Kévin Dunglas * * @deprecated since symfony/psr-http-message-bridge 1.2, use PsrHttpFactory instead */ class DiactorosFactory implements HttpMessageFactoryInterface { public function __construct() { if (!class_exists('Zend\Diactoros\ServerRequestFactory')) { throw new \RuntimeException('Zend Diactoros must be installed to use the DiactorosFactory.'); } } /** * {@inheritdoc} */ public function createRequest(Request $symfonyRequest) { $server = method_exists('Zend\Diactoros\ServerRequestFactory', 'normalizeServer') ? DiactorosRequestFactory::normalizeServer($symfonyRequest->server->all()) : \Zend\Diactoros\normalizeServer($symfonyRequest->server->all()); $headers = $symfonyRequest->headers->all(); $body = new DiactorosStream($symfonyRequest->getContent(true)); $files = method_exists('Zend\Diactoros\ServerRequestFactory', 'normalizeFiles') ? DiactorosRequestFactory::normalizeFiles($this->getFiles($symfonyRequest->files->all())) : \Zend\Diactoros\normalizeUploadedFiles($this->getFiles($symfonyRequest->files->all())); $request = new ServerRequest( $server, $files, $symfonyRequest->getSchemeAndHttpHost().$symfonyRequest->getRequestUri(), $symfonyRequest->getMethod(), $body, $headers ); $request = $request ->withCookieParams($symfonyRequest->cookies->all()) ->withQueryParams($symfonyRequest->query->all()) ->withParsedBody($symfonyRequest->request->all()) ->withRequestTarget($symfonyRequest->getRequestUri()) ; foreach ($symfonyRequest->attributes->all() as $key => $value) { $request = $request->withAttribute($key, $value); } return $request; } /** * Converts Symfony uploaded files array to the PSR one. * * @return array */ private function getFiles(array $uploadedFiles) { $files = []; foreach ($uploadedFiles as $key => $value) { if (null === $value) { $files[$key] = new DiactorosUploadedFile(null, 0, UPLOAD_ERR_NO_FILE, null, null); continue; } if ($value instanceof UploadedFile) { $files[$key] = $this->createUploadedFile($value); } else { $files[$key] = $this->getFiles($value); } } return $files; } /** * Creates a PSR-7 UploadedFile instance from a Symfony one. * * @return UploadedFileInterface */ private function createUploadedFile(UploadedFile $symfonyUploadedFile) { return new DiactorosUploadedFile( $symfonyUploadedFile->getRealPath(), (int) $symfonyUploadedFile->getSize(), $symfonyUploadedFile->getError(), $symfonyUploadedFile->getClientOriginalName(), $symfonyUploadedFile->getClientMimeType() ); } /** * {@inheritdoc} */ public function createResponse(Response $symfonyResponse) { if ($symfonyResponse instanceof BinaryFileResponse) { $stream = new DiactorosStream($symfonyResponse->getFile()->getPathname(), 'r'); } else { $stream = new DiactorosStream('php://temp', 'wb+'); if ($symfonyResponse instanceof StreamedResponse) { ob_start(function ($buffer) use ($stream) { $stream->write($buffer); return ''; }); $symfonyResponse->sendContent(); ob_end_clean(); } else { $stream->write($symfonyResponse->getContent()); } } $headers = $symfonyResponse->headers->all(); if (!isset($headers['Set-Cookie']) && !isset($headers['set-cookie'])) { $cookies = $symfonyResponse->headers->getCookies(); if (!empty($cookies)) { $headers['Set-Cookie'] = []; foreach ($cookies as $cookie) { $headers['Set-Cookie'][] = $cookie->__toString(); } } } $response = new DiactorosResponse( $stream, $symfonyResponse->getStatusCode(), $headers ); $protocolVersion = $symfonyResponse->getProtocolVersion(); if ('1.1' !== $protocolVersion) { $response = $response->withProtocolVersion($protocolVersion); } return $response; } }