Mercurial > hg > isophonics-drupal-site
comparison vendor/symfony/psr-http-message-bridge/Factory/PsrHttpFactory.php @ 17:129ea1e6d783
Update, including to Drupal core 8.6.10
author | Chris Cannam |
---|---|
date | Thu, 28 Feb 2019 13:21:36 +0000 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
16:c2387f117808 | 17:129ea1e6d783 |
---|---|
1 <?php | |
2 | |
3 /* | |
4 * This file is part of the Symfony package. | |
5 * | |
6 * (c) Fabien Potencier <fabien@symfony.com> | |
7 * | |
8 * For the full copyright and license information, please view the LICENSE | |
9 * file that was distributed with this source code. | |
10 */ | |
11 | |
12 namespace Symfony\Bridge\PsrHttpMessage\Factory; | |
13 | |
14 use Psr\Http\Message\ResponseFactoryInterface; | |
15 use Psr\Http\Message\ServerRequestFactoryInterface; | |
16 use Psr\Http\Message\StreamFactoryInterface; | |
17 use Psr\Http\Message\UploadedFileFactoryInterface; | |
18 use Psr\Http\Message\UploadedFileInterface; | |
19 use Symfony\Bridge\PsrHttpMessage\HttpMessageFactoryInterface; | |
20 use Symfony\Component\HttpFoundation\BinaryFileResponse; | |
21 use Symfony\Component\HttpFoundation\File\UploadedFile; | |
22 use Symfony\Component\HttpFoundation\Request; | |
23 use Symfony\Component\HttpFoundation\Response; | |
24 use Symfony\Component\HttpFoundation\StreamedResponse; | |
25 | |
26 /** | |
27 * Builds Psr\HttpMessage instances using a PSR-17 implementation. | |
28 * | |
29 * @author Antonio J. GarcĂa Lagar <aj@garcialagar.es> | |
30 */ | |
31 class PsrHttpFactory implements HttpMessageFactoryInterface | |
32 { | |
33 private $serverRequestFactory; | |
34 private $streamFactory; | |
35 private $uploadedFileFactory; | |
36 private $responseFactory; | |
37 | |
38 public function __construct(ServerRequestFactoryInterface $serverRequestFactory, StreamFactoryInterface $streamFactory, UploadedFileFactoryInterface $uploadedFileFactory, ResponseFactoryInterface $responseFactory) | |
39 { | |
40 $this->serverRequestFactory = $serverRequestFactory; | |
41 $this->streamFactory = $streamFactory; | |
42 $this->uploadedFileFactory = $uploadedFileFactory; | |
43 $this->responseFactory = $responseFactory; | |
44 } | |
45 | |
46 /** | |
47 * {@inheritdoc} | |
48 */ | |
49 public function createRequest(Request $symfonyRequest) | |
50 { | |
51 $request = $this->serverRequestFactory->createServerRequest( | |
52 $symfonyRequest->getMethod(), | |
53 $symfonyRequest->getSchemeAndHttpHost().$symfonyRequest->getRequestUri(), | |
54 $symfonyRequest->server->all() | |
55 ); | |
56 | |
57 foreach ($symfonyRequest->headers->all() as $name => $value) { | |
58 $request = $request->withHeader($name, $value); | |
59 } | |
60 | |
61 if (PHP_VERSION_ID < 50600) { | |
62 $body = $this->streamFactory->createStreamFromFile('php://temp', 'wb+'); | |
63 $body->write($symfonyRequest->getContent()); | |
64 } else { | |
65 $body = $this->streamFactory->createStreamFromResource($symfonyRequest->getContent(true)); | |
66 } | |
67 | |
68 $request = $request | |
69 ->withBody($body) | |
70 ->withUploadedFiles($this->getFiles($symfonyRequest->files->all())) | |
71 ->withCookieParams($symfonyRequest->cookies->all()) | |
72 ->withQueryParams($symfonyRequest->query->all()) | |
73 ->withParsedBody($symfonyRequest->request->all()) | |
74 ; | |
75 | |
76 foreach ($symfonyRequest->attributes->all() as $key => $value) { | |
77 $request = $request->withAttribute($key, $value); | |
78 } | |
79 | |
80 return $request; | |
81 } | |
82 | |
83 /** | |
84 * Converts Symfony uploaded files array to the PSR one. | |
85 * | |
86 * @param array $uploadedFiles | |
87 * | |
88 * @return array | |
89 */ | |
90 private function getFiles(array $uploadedFiles) | |
91 { | |
92 $files = array(); | |
93 | |
94 foreach ($uploadedFiles as $key => $value) { | |
95 if (null === $value) { | |
96 $files[$key] = $this->uploadedFileFactory->createUploadedFile($this->streamFactory->createStream(), 0, UPLOAD_ERR_NO_FILE); | |
97 continue; | |
98 } | |
99 if ($value instanceof UploadedFile) { | |
100 $files[$key] = $this->createUploadedFile($value); | |
101 } else { | |
102 $files[$key] = $this->getFiles($value); | |
103 } | |
104 } | |
105 | |
106 return $files; | |
107 } | |
108 | |
109 /** | |
110 * Creates a PSR-7 UploadedFile instance from a Symfony one. | |
111 * | |
112 * @param UploadedFile $symfonyUploadedFile | |
113 * | |
114 * @return UploadedFileInterface | |
115 */ | |
116 private function createUploadedFile(UploadedFile $symfonyUploadedFile) | |
117 { | |
118 return $this->uploadedFileFactory->createUploadedFile( | |
119 $this->streamFactory->createStreamFromFile( | |
120 $symfonyUploadedFile->getRealPath() | |
121 ), | |
122 (int) $symfonyUploadedFile->getSize(), | |
123 $symfonyUploadedFile->getError(), | |
124 $symfonyUploadedFile->getClientOriginalName(), | |
125 $symfonyUploadedFile->getClientMimeType() | |
126 ); | |
127 } | |
128 | |
129 /** | |
130 * {@inheritdoc} | |
131 */ | |
132 public function createResponse(Response $symfonyResponse) | |
133 { | |
134 $response = $this->responseFactory->createResponse($symfonyResponse->getStatusCode()); | |
135 | |
136 if ($symfonyResponse instanceof BinaryFileResponse) { | |
137 $stream = $this->streamFactory->createStreamFromFile( | |
138 $symfonyResponse->getFile()->getPathname() | |
139 ); | |
140 } else { | |
141 $stream = $this->streamFactory->createStreamFromFile('php://temp', 'wb+'); | |
142 if ($symfonyResponse instanceof StreamedResponse) { | |
143 ob_start(function ($buffer) use ($stream) { | |
144 $stream->write($buffer); | |
145 | |
146 return ''; | |
147 }); | |
148 | |
149 $symfonyResponse->sendContent(); | |
150 ob_end_clean(); | |
151 } else { | |
152 $stream->write($symfonyResponse->getContent()); | |
153 } | |
154 } | |
155 | |
156 $response = $response->withBody($stream); | |
157 | |
158 $headers = $symfonyResponse->headers->all(); | |
159 $cookies = $symfonyResponse->headers->getCookies(); | |
160 if (!empty($cookies)) { | |
161 $headers['Set-Cookie'] = array(); | |
162 | |
163 foreach ($cookies as $cookie) { | |
164 $headers['Set-Cookie'][] = $cookie->__toString(); | |
165 } | |
166 } | |
167 | |
168 foreach ($headers as $name => $value) { | |
169 $response = $response->withHeader($name, $value); | |
170 } | |
171 | |
172 $protocolVersion = $symfonyResponse->getProtocolVersion(); | |
173 $response = $response->withProtocolVersion($protocolVersion); | |
174 | |
175 return $response; | |
176 } | |
177 } |