comparison vendor/symfony/http-kernel/DataCollector/RequestDataCollector.php @ 14:1fec387a4317

Update Drupal core to 8.5.2 via Composer
author Chris Cannam
date Mon, 23 Apr 2018 09:46:53 +0100
parents 4c8ae668cc8c
children 129ea1e6d783
comparison
equal deleted inserted replaced
13:5fb285c0d0e3 14:1fec387a4317
9 * file that was distributed with this source code. 9 * file that was distributed with this source code.
10 */ 10 */
11 11
12 namespace Symfony\Component\HttpKernel\DataCollector; 12 namespace Symfony\Component\HttpKernel\DataCollector;
13 13
14 use Symfony\Component\HttpFoundation\Cookie;
14 use Symfony\Component\HttpFoundation\ParameterBag; 15 use Symfony\Component\HttpFoundation\ParameterBag;
15 use Symfony\Component\HttpFoundation\Request; 16 use Symfony\Component\HttpFoundation\Request;
16 use Symfony\Component\HttpFoundation\Response; 17 use Symfony\Component\HttpFoundation\Response;
17 use Symfony\Component\HttpKernel\Event\FilterResponseEvent; 18 use Symfony\Component\HttpKernel\Event\FilterResponseEvent;
18 use Symfony\Component\HttpKernel\KernelEvents; 19 use Symfony\Component\HttpKernel\KernelEvents;
19 use Symfony\Component\HttpKernel\Event\FilterControllerEvent; 20 use Symfony\Component\HttpKernel\Event\FilterControllerEvent;
20 use Symfony\Component\EventDispatcher\EventSubscriberInterface; 21 use Symfony\Component\EventDispatcher\EventSubscriberInterface;
21 22
22 /** 23 /**
23 * RequestDataCollector.
24 *
25 * @author Fabien Potencier <fabien@symfony.com> 24 * @author Fabien Potencier <fabien@symfony.com>
26 */ 25 */
27 class RequestDataCollector extends DataCollector implements EventSubscriberInterface 26 class RequestDataCollector extends DataCollector implements EventSubscriberInterface, LateDataCollectorInterface
28 { 27 {
29 /** @var \SplObjectStorage */
30 protected $controllers; 28 protected $controllers;
31 29
32 public function __construct() 30 public function __construct()
33 { 31 {
34 $this->controllers = new \SplObjectStorage(); 32 $this->controllers = new \SplObjectStorage();
37 /** 35 /**
38 * {@inheritdoc} 36 * {@inheritdoc}
39 */ 37 */
40 public function collect(Request $request, Response $response, \Exception $exception = null) 38 public function collect(Request $request, Response $response, \Exception $exception = null)
41 { 39 {
42 $responseHeaders = $response->headers->all();
43 foreach ($response->headers->getCookies() as $cookie) {
44 $responseHeaders['set-cookie'][] = (string) $cookie;
45 }
46
47 // attributes are serialized and as they can be anything, they need to be converted to strings. 40 // attributes are serialized and as they can be anything, they need to be converted to strings.
48 $attributes = array(); 41 $attributes = array();
49 $route = ''; 42 $route = '';
50 foreach ($request->attributes->all() as $key => $value) { 43 foreach ($request->attributes->all() as $key => $value) {
51 if ('_route' === $key) { 44 if ('_route' === $key) {
78 $flashes = $session->getFlashBag()->peekAll(); 71 $flashes = $session->getFlashBag()->peekAll();
79 } 72 }
80 } 73 }
81 74
82 $statusCode = $response->getStatusCode(); 75 $statusCode = $response->getStatusCode();
76
77 $responseCookies = array();
78 foreach ($response->headers->getCookies() as $cookie) {
79 $responseCookies[$cookie->getName()] = $cookie;
80 }
83 81
84 $this->data = array( 82 $this->data = array(
85 'method' => $request->getMethod(), 83 'method' => $request->getMethod(),
86 'format' => $request->getRequestFormat(), 84 'format' => $request->getRequestFormat(),
87 'content' => $content, 85 'content' => $content,
93 'request_headers' => $request->headers->all(), 91 'request_headers' => $request->headers->all(),
94 'request_server' => $request->server->all(), 92 'request_server' => $request->server->all(),
95 'request_cookies' => $request->cookies->all(), 93 'request_cookies' => $request->cookies->all(),
96 'request_attributes' => $attributes, 94 'request_attributes' => $attributes,
97 'route' => $route, 95 'route' => $route,
98 'response_headers' => $responseHeaders, 96 'response_headers' => $response->headers->all(),
97 'response_cookies' => $responseCookies,
99 'session_metadata' => $sessionMetadata, 98 'session_metadata' => $sessionMetadata,
100 'session_attributes' => $sessionAttributes, 99 'session_attributes' => $sessionAttributes,
101 'flashes' => $flashes, 100 'flashes' => $flashes,
102 'path_info' => $request->getPathInfo(), 101 'path_info' => $request->getPathInfo(),
103 'controller' => 'n/a', 102 'controller' => 'n/a',
119 foreach ($this->data as $key => $value) { 118 foreach ($this->data as $key => $value) {
120 if (!is_array($value)) { 119 if (!is_array($value)) {
121 continue; 120 continue;
122 } 121 }
123 if ('request_headers' === $key || 'response_headers' === $key) { 122 if ('request_headers' === $key || 'response_headers' === $key) {
124 $value = array_map(function ($v) { return isset($v[0]) && !isset($v[1]) ? $v[0] : $v; }, $value); 123 $this->data[$key] = array_map(function ($v) { return isset($v[0]) && !isset($v[1]) ? $v[0] : $v; }, $value);
125 }
126 if ('request_server' !== $key && 'request_cookies' !== $key) {
127 $this->data[$key] = array_map(array($this, 'cloneVar'), $value);
128 } 124 }
129 } 125 }
130 126
131 if (isset($this->controllers[$request])) { 127 if (isset($this->controllers[$request])) {
132 $this->data['controller'] = $this->parseController($this->controllers[$request]); 128 $this->data['controller'] = $this->parseController($this->controllers[$request]);
133 unset($this->controllers[$request]); 129 unset($this->controllers[$request]);
134 } 130 }
135 131
136 if (null !== $session && $session->isStarted()) { 132 if ($request->attributes->has('_redirected') && $redirectCookie = $request->cookies->get('sf_redirect')) {
137 if ($request->attributes->has('_redirected')) { 133 $this->data['redirect'] = json_decode($redirectCookie, true);
138 $this->data['redirect'] = $session->remove('sf_redirect'); 134
139 } 135 $response->headers->clearCookie('sf_redirect');
140 136 }
141 if ($response->isRedirect()) { 137
142 $session->set('sf_redirect', array( 138 if ($response->isRedirect()) {
139 $response->headers->setCookie(new Cookie(
140 'sf_redirect',
141 json_encode(array(
143 'token' => $response->headers->get('x-debug-token'), 142 'token' => $response->headers->get('x-debug-token'),
144 'route' => $request->attributes->get('_route', 'n/a'), 143 'route' => $request->attributes->get('_route', 'n/a'),
145 'method' => $request->getMethod(), 144 'method' => $request->getMethod(),
146 'controller' => $this->parseController($request->attributes->get('_controller')), 145 'controller' => $this->parseController($request->attributes->get('_controller')),
147 'status_code' => $statusCode, 146 'status_code' => $statusCode,
148 'status_text' => Response::$statusTexts[(int) $statusCode], 147 'status_text' => Response::$statusTexts[(int) $statusCode],
149 )); 148 ))
150 } 149 ));
151 } 150 }
151
152 $this->data['identifier'] = $this->data['route'] ?: (is_array($this->data['controller']) ? $this->data['controller']['class'].'::'.$this->data['controller']['method'].'()' : $this->data['controller']);
153 }
154
155 public function lateCollect()
156 {
157 $this->data = $this->cloneVar($this->data);
158 }
159
160 public function reset()
161 {
162 $this->data = array();
163 $this->controllers = new \SplObjectStorage();
152 } 164 }
153 165
154 public function getMethod() 166 public function getMethod()
155 { 167 {
156 return $this->data['method']; 168 return $this->data['method'];
161 return $this->data['path_info']; 173 return $this->data['path_info'];
162 } 174 }
163 175
164 public function getRequestRequest() 176 public function getRequestRequest()
165 { 177 {
166 return new ParameterBag($this->data['request_request']); 178 return new ParameterBag($this->data['request_request']->getValue());
167 } 179 }
168 180
169 public function getRequestQuery() 181 public function getRequestQuery()
170 { 182 {
171 return new ParameterBag($this->data['request_query']); 183 return new ParameterBag($this->data['request_query']->getValue());
172 } 184 }
173 185
174 public function getRequestHeaders() 186 public function getRequestHeaders()
175 { 187 {
176 return new ParameterBag($this->data['request_headers']); 188 return new ParameterBag($this->data['request_headers']->getValue());
177 } 189 }
178 190
179 public function getRequestServer($raw = false) 191 public function getRequestServer($raw = false)
180 { 192 {
181 return new ParameterBag($raw ? $this->data['request_server'] : array_map(array($this, 'cloneVar'), $this->data['request_server'])); 193 return new ParameterBag($this->data['request_server']->getValue($raw));
182 } 194 }
183 195
184 public function getRequestCookies($raw = false) 196 public function getRequestCookies($raw = false)
185 { 197 {
186 return new ParameterBag($raw ? $this->data['request_cookies'] : array_map(array($this, 'cloneVar'), $this->data['request_cookies'])); 198 return new ParameterBag($this->data['request_cookies']->getValue($raw));
187 } 199 }
188 200
189 public function getRequestAttributes() 201 public function getRequestAttributes()
190 { 202 {
191 return new ParameterBag($this->data['request_attributes']); 203 return new ParameterBag($this->data['request_attributes']->getValue());
192 } 204 }
193 205
194 public function getResponseHeaders() 206 public function getResponseHeaders()
195 { 207 {
196 return new ParameterBag($this->data['response_headers']); 208 return new ParameterBag($this->data['response_headers']->getValue());
209 }
210
211 public function getResponseCookies()
212 {
213 return new ParameterBag($this->data['response_cookies']->getValue());
197 } 214 }
198 215
199 public function getSessionMetadata() 216 public function getSessionMetadata()
200 { 217 {
201 return $this->data['session_metadata']; 218 return $this->data['session_metadata']->getValue();
202 } 219 }
203 220
204 public function getSessionAttributes() 221 public function getSessionAttributes()
205 { 222 {
206 return $this->data['session_attributes']; 223 return $this->data['session_attributes']->getValue();
207 } 224 }
208 225
209 public function getFlashes() 226 public function getFlashes()
210 { 227 {
211 return $this->data['flashes']; 228 return $this->data['flashes']->getValue();
212 } 229 }
213 230
214 public function getContent() 231 public function getContent()
215 { 232 {
216 return $this->data['content']; 233 return $this->data['content'];
253 return $this->data['route']; 270 return $this->data['route'];
254 } 271 }
255 272
256 public function getIdentifier() 273 public function getIdentifier()
257 { 274 {
258 return $this->data['route'] ?: (is_array($this->data['controller']) ? $this->data['controller']['class'].'::'.$this->data['controller']['method'].'()' : $this->data['controller']); 275 return $this->data['identifier'];
259 } 276 }
260 277
261 /** 278 /**
262 * Gets the route parameters. 279 * Gets the route parameters.
263 * 280 *
265 * 282 *
266 * @return array The parameters 283 * @return array The parameters
267 */ 284 */
268 public function getRouteParams() 285 public function getRouteParams()
269 { 286 {
270 if (!isset($this->data['request_attributes']['_route_params'])) { 287 return isset($this->data['request_attributes']['_route_params']) ? $this->data['request_attributes']['_route_params']->getValue() : array();
271 return array();
272 }
273
274 $data = $this->data['request_attributes']['_route_params'];
275 $rawData = $data->getRawData();
276 if (!isset($rawData[1])) {
277 return array();
278 }
279
280 $params = array();
281 foreach ($rawData[1] as $k => $v) {
282 $params[$k] = $data->seek($k);
283 }
284
285 return $params;
286 } 288 }
287 289
288 /** 290 /**
289 * Gets the parsed controller. 291 * Gets the parsed controller.
290 * 292 *
312 $this->controllers[$event->getRequest()] = $event->getController(); 314 $this->controllers[$event->getRequest()] = $event->getController();
313 } 315 }
314 316
315 public function onKernelResponse(FilterResponseEvent $event) 317 public function onKernelResponse(FilterResponseEvent $event)
316 { 318 {
317 if (!$event->isMasterRequest() || !$event->getRequest()->hasSession() || !$event->getRequest()->getSession()->isStarted()) { 319 if (!$event->isMasterRequest()) {
318 return; 320 return;
319 } 321 }
320 322
321 if ($event->getRequest()->getSession()->has('sf_redirect')) { 323 if ($event->getRequest()->cookies->has('sf_redirect')) {
322 $event->getRequest()->attributes->set('_redirected', true); 324 $event->getRequest()->attributes->set('_redirected', true);
323 } 325 }
324 } 326 }
325 327
326 public static function getSubscribedEvents() 328 public static function getSubscribedEvents()