| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171 | <?php/* * This file is part of the Symfony package. * * (c) Fabien Potencier <fabien@symfony.com> * * 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 <dunglas@gmail.com> * * @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;    }}
 |