PageRenderTime 29ms CodeModel.GetById 17ms RepoModel.GetById 0ms app.codeStats 0ms

/vendor/symfony/psr-http-message-bridge/Factory/DiactorosFactory.php

https://gitlab.com/reasonat/test8
PHP | 164 lines | 108 code | 23 blank | 33 comment | 9 complexity | 3cbadad4ff748cd1d06d63e63c05b26f MD5 | raw file
  1. <?php
  2. /*
  3. * This file is part of the Symfony package.
  4. *
  5. * (c) Fabien Potencier <fabien@symfony.com>
  6. *
  7. * For the full copyright and license information, please view the LICENSE
  8. * file that was distributed with this source code.
  9. */
  10. namespace Symfony\Bridge\PsrHttpMessage\Factory;
  11. use Symfony\Bridge\PsrHttpMessage\HttpMessageFactoryInterface;
  12. use Symfony\Component\HttpFoundation\BinaryFileResponse;
  13. use Symfony\Component\HttpFoundation\File\UploadedFile;
  14. use Symfony\Component\HttpFoundation\Request;
  15. use Symfony\Component\HttpFoundation\Response;
  16. use Symfony\Component\HttpFoundation\StreamedResponse;
  17. use Zend\Diactoros\Response as DiactorosResponse;
  18. use Zend\Diactoros\ServerRequest;
  19. use Zend\Diactoros\ServerRequestFactory as DiactorosRequestFactory;
  20. use Zend\Diactoros\Stream as DiactorosStream;
  21. use Zend\Diactoros\UploadedFile as DiactorosUploadedFile;
  22. /**
  23. * Builds Psr\HttpMessage instances using the Zend Diactoros implementation.
  24. *
  25. * @author Kévin Dunglas <dunglas@gmail.com>
  26. */
  27. class DiactorosFactory implements HttpMessageFactoryInterface
  28. {
  29. public function __construct()
  30. {
  31. if (!class_exists('Zend\Diactoros\ServerRequestFactory')) {
  32. throw new \RuntimeException('Zend Diactoros must be installed to use the DiactorosFactory.');
  33. }
  34. }
  35. /**
  36. * {@inheritdoc}
  37. */
  38. public function createRequest(Request $symfonyRequest)
  39. {
  40. $server = DiactorosRequestFactory::normalizeServer($symfonyRequest->server->all());
  41. $headers = $symfonyRequest->headers->all();
  42. try {
  43. $body = new DiactorosStream($symfonyRequest->getContent(true));
  44. } catch (\LogicException $e) {
  45. $body = new DiactorosStream('php://temp', 'wb+');
  46. $body->write($symfonyRequest->getContent());
  47. }
  48. $request = new ServerRequest(
  49. $server,
  50. DiactorosRequestFactory::normalizeFiles($this->getFiles($symfonyRequest->files->all())),
  51. $symfonyRequest->getUri(),
  52. $symfonyRequest->getMethod(),
  53. $body,
  54. $headers
  55. );
  56. $request = $request
  57. ->withCookieParams($symfonyRequest->cookies->all())
  58. ->withQueryParams($symfonyRequest->query->all())
  59. ->withParsedBody($symfonyRequest->request->all())
  60. ;
  61. foreach ($symfonyRequest->attributes->all() as $key => $value) {
  62. $request = $request->withAttribute($key, $value);
  63. }
  64. return $request;
  65. }
  66. /**
  67. * Converts Symfony uploaded files array to the PSR one.
  68. *
  69. * @param array $uploadedFiles
  70. *
  71. * @return array
  72. */
  73. private function getFiles(array $uploadedFiles)
  74. {
  75. $files = array();
  76. foreach ($uploadedFiles as $key => $value) {
  77. if ($value instanceof UploadedFile) {
  78. $files[$key] = $this->createUploadedFile($value);
  79. } else {
  80. $files[$key] = $this->getFiles($value);
  81. }
  82. }
  83. return $files;
  84. }
  85. /**
  86. * Creates a PSR-7 UploadedFile instance from a Symfony one.
  87. *
  88. * @param UploadedFile $symfonyUploadedFile
  89. *
  90. * @return UploadedFileInterface
  91. */
  92. private function createUploadedFile(UploadedFile $symfonyUploadedFile)
  93. {
  94. return new DiactorosUploadedFile(
  95. $symfonyUploadedFile->getRealPath(),
  96. $symfonyUploadedFile->getSize(),
  97. $symfonyUploadedFile->getError(),
  98. $symfonyUploadedFile->getClientOriginalName(),
  99. $symfonyUploadedFile->getClientMimeType()
  100. );
  101. }
  102. /**
  103. * {@inheritdoc}
  104. */
  105. public function createResponse(Response $symfonyResponse)
  106. {
  107. if ($symfonyResponse instanceof BinaryFileResponse) {
  108. $stream = new DiactorosStream($symfonyResponse->getFile()->getPathname(), 'r');
  109. } else {
  110. $stream = new DiactorosStream('php://temp', 'wb+');
  111. if ($symfonyResponse instanceof StreamedResponse) {
  112. ob_start(function ($buffer) use ($stream) {
  113. $stream->write($buffer);
  114. return false;
  115. });
  116. $symfonyResponse->sendContent();
  117. ob_end_clean();
  118. } else {
  119. $stream->write($symfonyResponse->getContent());
  120. }
  121. }
  122. $headers = $symfonyResponse->headers->all();
  123. $cookies = $symfonyResponse->headers->getCookies();
  124. if (!empty($cookies)) {
  125. $headers['Set-Cookie'] = array();
  126. foreach ($cookies as $cookie) {
  127. $headers['Set-Cookie'][] = $cookie->__toString();
  128. }
  129. }
  130. $response = new DiactorosResponse(
  131. $stream,
  132. $symfonyResponse->getStatusCode(),
  133. $headers
  134. );
  135. $protocolVersion = $symfonyResponse->getProtocolVersion();
  136. if ('1.1' !== $protocolVersion) {
  137. $response = $response->withProtocolVersion($protocolVersion);
  138. }
  139. return $response;
  140. }
  141. }