Daniel@0
|
1 <?php
|
Daniel@0
|
2
|
Daniel@0
|
3 namespace { $loader = require_once __DIR__.'/./autoload.php'; }
|
Daniel@0
|
4
|
Daniel@0
|
5
|
Daniel@0
|
6 namespace Symfony\Component\HttpFoundation
|
Daniel@0
|
7 {
|
Daniel@0
|
8 class ParameterBag implements \IteratorAggregate, \Countable
|
Daniel@0
|
9 {
|
Daniel@0
|
10 protected $parameters;
|
Daniel@0
|
11 public function __construct(array $parameters = array())
|
Daniel@0
|
12 {
|
Daniel@0
|
13 $this->parameters = $parameters;
|
Daniel@0
|
14 }
|
Daniel@0
|
15 public function all()
|
Daniel@0
|
16 {
|
Daniel@0
|
17 return $this->parameters;
|
Daniel@0
|
18 }
|
Daniel@0
|
19 public function keys()
|
Daniel@0
|
20 {
|
Daniel@0
|
21 return array_keys($this->parameters);
|
Daniel@0
|
22 }
|
Daniel@0
|
23 public function replace(array $parameters = array())
|
Daniel@0
|
24 {
|
Daniel@0
|
25 $this->parameters = $parameters;
|
Daniel@0
|
26 }
|
Daniel@0
|
27 public function add(array $parameters = array())
|
Daniel@0
|
28 {
|
Daniel@0
|
29 $this->parameters = array_replace($this->parameters, $parameters);
|
Daniel@0
|
30 }
|
Daniel@0
|
31 public function get($path, $default = null, $deep = false)
|
Daniel@0
|
32 {
|
Daniel@0
|
33 if (!$deep || false === $pos = strpos($path,'[')) {
|
Daniel@0
|
34 return array_key_exists($path, $this->parameters) ? $this->parameters[$path] : $default;
|
Daniel@0
|
35 }
|
Daniel@0
|
36 $root = substr($path, 0, $pos);
|
Daniel@0
|
37 if (!array_key_exists($root, $this->parameters)) {
|
Daniel@0
|
38 return $default;
|
Daniel@0
|
39 }
|
Daniel@0
|
40 $value = $this->parameters[$root];
|
Daniel@0
|
41 $currentKey = null;
|
Daniel@0
|
42 for ($i = $pos, $c = strlen($path); $i < $c; $i++) {
|
Daniel@0
|
43 $char = $path[$i];
|
Daniel@0
|
44 if ('['=== $char) {
|
Daniel@0
|
45 if (null !== $currentKey) {
|
Daniel@0
|
46 throw new \InvalidArgumentException(sprintf('Malformed path. Unexpected "[" at position %d.', $i));
|
Daniel@0
|
47 }
|
Daniel@0
|
48 $currentKey ='';
|
Daniel@0
|
49 } elseif (']'=== $char) {
|
Daniel@0
|
50 if (null === $currentKey) {
|
Daniel@0
|
51 throw new \InvalidArgumentException(sprintf('Malformed path. Unexpected "]" at position %d.', $i));
|
Daniel@0
|
52 }
|
Daniel@0
|
53 if (!is_array($value) || !array_key_exists($currentKey, $value)) {
|
Daniel@0
|
54 return $default;
|
Daniel@0
|
55 }
|
Daniel@0
|
56 $value = $value[$currentKey];
|
Daniel@0
|
57 $currentKey = null;
|
Daniel@0
|
58 } else {
|
Daniel@0
|
59 if (null === $currentKey) {
|
Daniel@0
|
60 throw new \InvalidArgumentException(sprintf('Malformed path. Unexpected "%s" at position %d.', $char, $i));
|
Daniel@0
|
61 }
|
Daniel@0
|
62 $currentKey .= $char;
|
Daniel@0
|
63 }
|
Daniel@0
|
64 }
|
Daniel@0
|
65 if (null !== $currentKey) {
|
Daniel@0
|
66 throw new \InvalidArgumentException(sprintf('Malformed path. Path must end with "]".'));
|
Daniel@0
|
67 }
|
Daniel@0
|
68 return $value;
|
Daniel@0
|
69 }
|
Daniel@0
|
70 public function set($key, $value)
|
Daniel@0
|
71 {
|
Daniel@0
|
72 $this->parameters[$key] = $value;
|
Daniel@0
|
73 }
|
Daniel@0
|
74 public function has($key)
|
Daniel@0
|
75 {
|
Daniel@0
|
76 return array_key_exists($key, $this->parameters);
|
Daniel@0
|
77 }
|
Daniel@0
|
78 public function remove($key)
|
Daniel@0
|
79 {
|
Daniel@0
|
80 unset($this->parameters[$key]);
|
Daniel@0
|
81 }
|
Daniel@0
|
82 public function getAlpha($key, $default ='', $deep = false)
|
Daniel@0
|
83 {
|
Daniel@0
|
84 return preg_replace('/[^[:alpha:]]/','', $this->get($key, $default, $deep));
|
Daniel@0
|
85 }
|
Daniel@0
|
86 public function getAlnum($key, $default ='', $deep = false)
|
Daniel@0
|
87 {
|
Daniel@0
|
88 return preg_replace('/[^[:alnum:]]/','', $this->get($key, $default, $deep));
|
Daniel@0
|
89 }
|
Daniel@0
|
90 public function getDigits($key, $default ='', $deep = false)
|
Daniel@0
|
91 {
|
Daniel@0
|
92 return str_replace(array('-','+'),'', $this->filter($key, $default, $deep, FILTER_SANITIZE_NUMBER_INT));
|
Daniel@0
|
93 }
|
Daniel@0
|
94 public function getInt($key, $default = 0, $deep = false)
|
Daniel@0
|
95 {
|
Daniel@0
|
96 return (int) $this->get($key, $default, $deep);
|
Daniel@0
|
97 }
|
Daniel@0
|
98 public function filter($key, $default = null, $deep = false, $filter = FILTER_DEFAULT, $options = array())
|
Daniel@0
|
99 {
|
Daniel@0
|
100 $value = $this->get($key, $default, $deep);
|
Daniel@0
|
101 if (!is_array($options) && $options) {
|
Daniel@0
|
102 $options = array('flags'=> $options);
|
Daniel@0
|
103 }
|
Daniel@0
|
104 if (is_array($value) && !isset($options['flags'])) {
|
Daniel@0
|
105 $options['flags'] = FILTER_REQUIRE_ARRAY;
|
Daniel@0
|
106 }
|
Daniel@0
|
107 return filter_var($value, $filter, $options);
|
Daniel@0
|
108 }
|
Daniel@0
|
109 public function getIterator()
|
Daniel@0
|
110 {
|
Daniel@0
|
111 return new \ArrayIterator($this->parameters);
|
Daniel@0
|
112 }
|
Daniel@0
|
113 public function count()
|
Daniel@0
|
114 {
|
Daniel@0
|
115 return count($this->parameters);
|
Daniel@0
|
116 }
|
Daniel@0
|
117 }
|
Daniel@0
|
118 }
|
Daniel@0
|
119 namespace Symfony\Component\HttpFoundation
|
Daniel@0
|
120 {
|
Daniel@0
|
121 class HeaderBag implements \IteratorAggregate, \Countable
|
Daniel@0
|
122 {
|
Daniel@0
|
123 protected $headers = array();
|
Daniel@0
|
124 protected $cacheControl = array();
|
Daniel@0
|
125 public function __construct(array $headers = array())
|
Daniel@0
|
126 {
|
Daniel@0
|
127 foreach ($headers as $key => $values) {
|
Daniel@0
|
128 $this->set($key, $values);
|
Daniel@0
|
129 }
|
Daniel@0
|
130 }
|
Daniel@0
|
131 public function __toString()
|
Daniel@0
|
132 {
|
Daniel@0
|
133 if (!$this->headers) {
|
Daniel@0
|
134 return'';
|
Daniel@0
|
135 }
|
Daniel@0
|
136 $max = max(array_map('strlen', array_keys($this->headers))) + 1;
|
Daniel@0
|
137 $content ='';
|
Daniel@0
|
138 ksort($this->headers);
|
Daniel@0
|
139 foreach ($this->headers as $name => $values) {
|
Daniel@0
|
140 $name = implode('-', array_map('ucfirst', explode('-', $name)));
|
Daniel@0
|
141 foreach ($values as $value) {
|
Daniel@0
|
142 $content .= sprintf("%-{$max}s %s\r\n", $name.':', $value);
|
Daniel@0
|
143 }
|
Daniel@0
|
144 }
|
Daniel@0
|
145 return $content;
|
Daniel@0
|
146 }
|
Daniel@0
|
147 public function all()
|
Daniel@0
|
148 {
|
Daniel@0
|
149 return $this->headers;
|
Daniel@0
|
150 }
|
Daniel@0
|
151 public function keys()
|
Daniel@0
|
152 {
|
Daniel@0
|
153 return array_keys($this->headers);
|
Daniel@0
|
154 }
|
Daniel@0
|
155 public function replace(array $headers = array())
|
Daniel@0
|
156 {
|
Daniel@0
|
157 $this->headers = array();
|
Daniel@0
|
158 $this->add($headers);
|
Daniel@0
|
159 }
|
Daniel@0
|
160 public function add(array $headers)
|
Daniel@0
|
161 {
|
Daniel@0
|
162 foreach ($headers as $key => $values) {
|
Daniel@0
|
163 $this->set($key, $values);
|
Daniel@0
|
164 }
|
Daniel@0
|
165 }
|
Daniel@0
|
166 public function get($key, $default = null, $first = true)
|
Daniel@0
|
167 {
|
Daniel@0
|
168 $key = strtr(strtolower($key),'_','-');
|
Daniel@0
|
169 if (!array_key_exists($key, $this->headers)) {
|
Daniel@0
|
170 if (null === $default) {
|
Daniel@0
|
171 return $first ? null : array();
|
Daniel@0
|
172 }
|
Daniel@0
|
173 return $first ? $default : array($default);
|
Daniel@0
|
174 }
|
Daniel@0
|
175 if ($first) {
|
Daniel@0
|
176 return count($this->headers[$key]) ? $this->headers[$key][0] : $default;
|
Daniel@0
|
177 }
|
Daniel@0
|
178 return $this->headers[$key];
|
Daniel@0
|
179 }
|
Daniel@0
|
180 public function set($key, $values, $replace = true)
|
Daniel@0
|
181 {
|
Daniel@0
|
182 $key = strtr(strtolower($key),'_','-');
|
Daniel@0
|
183 $values = array_values((array) $values);
|
Daniel@0
|
184 if (true === $replace || !isset($this->headers[$key])) {
|
Daniel@0
|
185 $this->headers[$key] = $values;
|
Daniel@0
|
186 } else {
|
Daniel@0
|
187 $this->headers[$key] = array_merge($this->headers[$key], $values);
|
Daniel@0
|
188 }
|
Daniel@0
|
189 if ('cache-control'=== $key) {
|
Daniel@0
|
190 $this->cacheControl = $this->parseCacheControl($values[0]);
|
Daniel@0
|
191 }
|
Daniel@0
|
192 }
|
Daniel@0
|
193 public function has($key)
|
Daniel@0
|
194 {
|
Daniel@0
|
195 return array_key_exists(strtr(strtolower($key),'_','-'), $this->headers);
|
Daniel@0
|
196 }
|
Daniel@0
|
197 public function contains($key, $value)
|
Daniel@0
|
198 {
|
Daniel@0
|
199 return in_array($value, $this->get($key, null, false));
|
Daniel@0
|
200 }
|
Daniel@0
|
201 public function remove($key)
|
Daniel@0
|
202 {
|
Daniel@0
|
203 $key = strtr(strtolower($key),'_','-');
|
Daniel@0
|
204 unset($this->headers[$key]);
|
Daniel@0
|
205 if ('cache-control'=== $key) {
|
Daniel@0
|
206 $this->cacheControl = array();
|
Daniel@0
|
207 }
|
Daniel@0
|
208 }
|
Daniel@0
|
209 public function getDate($key, \DateTime $default = null)
|
Daniel@0
|
210 {
|
Daniel@0
|
211 if (null === $value = $this->get($key)) {
|
Daniel@0
|
212 return $default;
|
Daniel@0
|
213 }
|
Daniel@0
|
214 if (false === $date = \DateTime::createFromFormat(DATE_RFC2822, $value)) {
|
Daniel@0
|
215 throw new \RuntimeException(sprintf('The %s HTTP header is not parseable (%s).', $key, $value));
|
Daniel@0
|
216 }
|
Daniel@0
|
217 return $date;
|
Daniel@0
|
218 }
|
Daniel@0
|
219 public function addCacheControlDirective($key, $value = true)
|
Daniel@0
|
220 {
|
Daniel@0
|
221 $this->cacheControl[$key] = $value;
|
Daniel@0
|
222 $this->set('Cache-Control', $this->getCacheControlHeader());
|
Daniel@0
|
223 }
|
Daniel@0
|
224 public function hasCacheControlDirective($key)
|
Daniel@0
|
225 {
|
Daniel@0
|
226 return array_key_exists($key, $this->cacheControl);
|
Daniel@0
|
227 }
|
Daniel@0
|
228 public function getCacheControlDirective($key)
|
Daniel@0
|
229 {
|
Daniel@0
|
230 return array_key_exists($key, $this->cacheControl) ? $this->cacheControl[$key] : null;
|
Daniel@0
|
231 }
|
Daniel@0
|
232 public function removeCacheControlDirective($key)
|
Daniel@0
|
233 {
|
Daniel@0
|
234 unset($this->cacheControl[$key]);
|
Daniel@0
|
235 $this->set('Cache-Control', $this->getCacheControlHeader());
|
Daniel@0
|
236 }
|
Daniel@0
|
237 public function getIterator()
|
Daniel@0
|
238 {
|
Daniel@0
|
239 return new \ArrayIterator($this->headers);
|
Daniel@0
|
240 }
|
Daniel@0
|
241 public function count()
|
Daniel@0
|
242 {
|
Daniel@0
|
243 return count($this->headers);
|
Daniel@0
|
244 }
|
Daniel@0
|
245 protected function getCacheControlHeader()
|
Daniel@0
|
246 {
|
Daniel@0
|
247 $parts = array();
|
Daniel@0
|
248 ksort($this->cacheControl);
|
Daniel@0
|
249 foreach ($this->cacheControl as $key => $value) {
|
Daniel@0
|
250 if (true === $value) {
|
Daniel@0
|
251 $parts[] = $key;
|
Daniel@0
|
252 } else {
|
Daniel@0
|
253 if (preg_match('#[^a-zA-Z0-9._-]#', $value)) {
|
Daniel@0
|
254 $value ='"'.$value.'"';
|
Daniel@0
|
255 }
|
Daniel@0
|
256 $parts[] = "$key=$value";
|
Daniel@0
|
257 }
|
Daniel@0
|
258 }
|
Daniel@0
|
259 return implode(', ', $parts);
|
Daniel@0
|
260 }
|
Daniel@0
|
261 protected function parseCacheControl($header)
|
Daniel@0
|
262 {
|
Daniel@0
|
263 $cacheControl = array();
|
Daniel@0
|
264 preg_match_all('#([a-zA-Z][a-zA-Z_-]*)\s*(?:=(?:"([^"]*)"|([^ \t",;]*)))?#', $header, $matches, PREG_SET_ORDER);
|
Daniel@0
|
265 foreach ($matches as $match) {
|
Daniel@0
|
266 $cacheControl[strtolower($match[1])] = isset($match[3]) ? $match[3] : (isset($match[2]) ? $match[2] : true);
|
Daniel@0
|
267 }
|
Daniel@0
|
268 return $cacheControl;
|
Daniel@0
|
269 }
|
Daniel@0
|
270 }
|
Daniel@0
|
271 }
|
Daniel@0
|
272 namespace Symfony\Component\HttpFoundation
|
Daniel@0
|
273 {
|
Daniel@0
|
274 use Symfony\Component\HttpFoundation\File\UploadedFile;
|
Daniel@0
|
275 class FileBag extends ParameterBag
|
Daniel@0
|
276 {
|
Daniel@0
|
277 private static $fileKeys = array('error','name','size','tmp_name','type');
|
Daniel@0
|
278 public function __construct(array $parameters = array())
|
Daniel@0
|
279 {
|
Daniel@0
|
280 $this->replace($parameters);
|
Daniel@0
|
281 }
|
Daniel@0
|
282 public function replace(array $files = array())
|
Daniel@0
|
283 {
|
Daniel@0
|
284 $this->parameters = array();
|
Daniel@0
|
285 $this->add($files);
|
Daniel@0
|
286 }
|
Daniel@0
|
287 public function set($key, $value)
|
Daniel@0
|
288 {
|
Daniel@0
|
289 if (!is_array($value) && !$value instanceof UploadedFile) {
|
Daniel@0
|
290 throw new \InvalidArgumentException('An uploaded file must be an array or an instance of UploadedFile.');
|
Daniel@0
|
291 }
|
Daniel@0
|
292 parent::set($key, $this->convertFileInformation($value));
|
Daniel@0
|
293 }
|
Daniel@0
|
294 public function add(array $files = array())
|
Daniel@0
|
295 {
|
Daniel@0
|
296 foreach ($files as $key => $file) {
|
Daniel@0
|
297 $this->set($key, $file);
|
Daniel@0
|
298 }
|
Daniel@0
|
299 }
|
Daniel@0
|
300 protected function convertFileInformation($file)
|
Daniel@0
|
301 {
|
Daniel@0
|
302 if ($file instanceof UploadedFile) {
|
Daniel@0
|
303 return $file;
|
Daniel@0
|
304 }
|
Daniel@0
|
305 $file = $this->fixPhpFilesArray($file);
|
Daniel@0
|
306 if (is_array($file)) {
|
Daniel@0
|
307 $keys = array_keys($file);
|
Daniel@0
|
308 sort($keys);
|
Daniel@0
|
309 if ($keys == self::$fileKeys) {
|
Daniel@0
|
310 if (UPLOAD_ERR_NO_FILE == $file['error']) {
|
Daniel@0
|
311 $file = null;
|
Daniel@0
|
312 } else {
|
Daniel@0
|
313 $file = new UploadedFile($file['tmp_name'], $file['name'], $file['type'], $file['size'], $file['error']);
|
Daniel@0
|
314 }
|
Daniel@0
|
315 } else {
|
Daniel@0
|
316 $file = array_map(array($this,'convertFileInformation'), $file);
|
Daniel@0
|
317 }
|
Daniel@0
|
318 }
|
Daniel@0
|
319 return $file;
|
Daniel@0
|
320 }
|
Daniel@0
|
321 protected function fixPhpFilesArray($data)
|
Daniel@0
|
322 {
|
Daniel@0
|
323 if (!is_array($data)) {
|
Daniel@0
|
324 return $data;
|
Daniel@0
|
325 }
|
Daniel@0
|
326 $keys = array_keys($data);
|
Daniel@0
|
327 sort($keys);
|
Daniel@0
|
328 if (self::$fileKeys != $keys || !isset($data['name']) || !is_array($data['name'])) {
|
Daniel@0
|
329 return $data;
|
Daniel@0
|
330 }
|
Daniel@0
|
331 $files = $data;
|
Daniel@0
|
332 foreach (self::$fileKeys as $k) {
|
Daniel@0
|
333 unset($files[$k]);
|
Daniel@0
|
334 }
|
Daniel@0
|
335 foreach (array_keys($data['name']) as $key) {
|
Daniel@0
|
336 $files[$key] = $this->fixPhpFilesArray(array('error'=> $data['error'][$key],'name'=> $data['name'][$key],'type'=> $data['type'][$key],'tmp_name'=> $data['tmp_name'][$key],'size'=> $data['size'][$key],
|
Daniel@0
|
337 ));
|
Daniel@0
|
338 }
|
Daniel@0
|
339 return $files;
|
Daniel@0
|
340 }
|
Daniel@0
|
341 }
|
Daniel@0
|
342 }
|
Daniel@0
|
343 namespace Symfony\Component\HttpFoundation
|
Daniel@0
|
344 {
|
Daniel@0
|
345 class ServerBag extends ParameterBag
|
Daniel@0
|
346 {
|
Daniel@0
|
347 public function getHeaders()
|
Daniel@0
|
348 {
|
Daniel@0
|
349 $headers = array();
|
Daniel@0
|
350 $contentHeaders = array('CONTENT_LENGTH'=> true,'CONTENT_MD5'=> true,'CONTENT_TYPE'=> true);
|
Daniel@0
|
351 foreach ($this->parameters as $key => $value) {
|
Daniel@0
|
352 if (0 === strpos($key,'HTTP_')) {
|
Daniel@0
|
353 $headers[substr($key, 5)] = $value;
|
Daniel@0
|
354 }
|
Daniel@0
|
355 elseif (isset($contentHeaders[$key])) {
|
Daniel@0
|
356 $headers[$key] = $value;
|
Daniel@0
|
357 }
|
Daniel@0
|
358 }
|
Daniel@0
|
359 if (isset($this->parameters['PHP_AUTH_USER'])) {
|
Daniel@0
|
360 $headers['PHP_AUTH_USER'] = $this->parameters['PHP_AUTH_USER'];
|
Daniel@0
|
361 $headers['PHP_AUTH_PW'] = isset($this->parameters['PHP_AUTH_PW']) ? $this->parameters['PHP_AUTH_PW'] :'';
|
Daniel@0
|
362 } else {
|
Daniel@0
|
363 $authorizationHeader = null;
|
Daniel@0
|
364 if (isset($this->parameters['HTTP_AUTHORIZATION'])) {
|
Daniel@0
|
365 $authorizationHeader = $this->parameters['HTTP_AUTHORIZATION'];
|
Daniel@0
|
366 } elseif (isset($this->parameters['REDIRECT_HTTP_AUTHORIZATION'])) {
|
Daniel@0
|
367 $authorizationHeader = $this->parameters['REDIRECT_HTTP_AUTHORIZATION'];
|
Daniel@0
|
368 }
|
Daniel@0
|
369 if (null !== $authorizationHeader) {
|
Daniel@0
|
370 if (0 === stripos($authorizationHeader,'basic ')) {
|
Daniel@0
|
371 $exploded = explode(':', base64_decode(substr($authorizationHeader, 6)), 2);
|
Daniel@0
|
372 if (count($exploded) == 2) {
|
Daniel@0
|
373 list($headers['PHP_AUTH_USER'], $headers['PHP_AUTH_PW']) = $exploded;
|
Daniel@0
|
374 }
|
Daniel@0
|
375 } elseif (empty($this->parameters['PHP_AUTH_DIGEST']) && (0 === stripos($authorizationHeader,'digest '))) {
|
Daniel@0
|
376 $headers['PHP_AUTH_DIGEST'] = $authorizationHeader;
|
Daniel@0
|
377 $this->parameters['PHP_AUTH_DIGEST'] = $authorizationHeader;
|
Daniel@0
|
378 }
|
Daniel@0
|
379 }
|
Daniel@0
|
380 }
|
Daniel@0
|
381 if (isset($headers['PHP_AUTH_USER'])) {
|
Daniel@0
|
382 $headers['AUTHORIZATION'] ='Basic '.base64_encode($headers['PHP_AUTH_USER'].':'.$headers['PHP_AUTH_PW']);
|
Daniel@0
|
383 } elseif (isset($headers['PHP_AUTH_DIGEST'])) {
|
Daniel@0
|
384 $headers['AUTHORIZATION'] = $headers['PHP_AUTH_DIGEST'];
|
Daniel@0
|
385 }
|
Daniel@0
|
386 return $headers;
|
Daniel@0
|
387 }
|
Daniel@0
|
388 }
|
Daniel@0
|
389 }
|
Daniel@0
|
390 namespace Symfony\Component\HttpFoundation
|
Daniel@0
|
391 {
|
Daniel@0
|
392 use Symfony\Component\HttpFoundation\Session\SessionInterface;
|
Daniel@0
|
393 class Request
|
Daniel@0
|
394 {
|
Daniel@0
|
395 const HEADER_CLIENT_IP ='client_ip';
|
Daniel@0
|
396 const HEADER_CLIENT_HOST ='client_host';
|
Daniel@0
|
397 const HEADER_CLIENT_PROTO ='client_proto';
|
Daniel@0
|
398 const HEADER_CLIENT_PORT ='client_port';
|
Daniel@0
|
399 protected static $trustedProxies = array();
|
Daniel@0
|
400 protected static $trustedHostPatterns = array();
|
Daniel@0
|
401 protected static $trustedHosts = array();
|
Daniel@0
|
402 protected static $trustedHeaders = array(
|
Daniel@0
|
403 self::HEADER_CLIENT_IP =>'X_FORWARDED_FOR',
|
Daniel@0
|
404 self::HEADER_CLIENT_HOST =>'X_FORWARDED_HOST',
|
Daniel@0
|
405 self::HEADER_CLIENT_PROTO =>'X_FORWARDED_PROTO',
|
Daniel@0
|
406 self::HEADER_CLIENT_PORT =>'X_FORWARDED_PORT',
|
Daniel@0
|
407 );
|
Daniel@0
|
408 protected static $httpMethodParameterOverride = false;
|
Daniel@0
|
409 public $attributes;
|
Daniel@0
|
410 public $request;
|
Daniel@0
|
411 public $query;
|
Daniel@0
|
412 public $server;
|
Daniel@0
|
413 public $files;
|
Daniel@0
|
414 public $cookies;
|
Daniel@0
|
415 public $headers;
|
Daniel@0
|
416 protected $content;
|
Daniel@0
|
417 protected $languages;
|
Daniel@0
|
418 protected $charsets;
|
Daniel@0
|
419 protected $encodings;
|
Daniel@0
|
420 protected $acceptableContentTypes;
|
Daniel@0
|
421 protected $pathInfo;
|
Daniel@0
|
422 protected $requestUri;
|
Daniel@0
|
423 protected $baseUrl;
|
Daniel@0
|
424 protected $basePath;
|
Daniel@0
|
425 protected $method;
|
Daniel@0
|
426 protected $format;
|
Daniel@0
|
427 protected $session;
|
Daniel@0
|
428 protected $locale;
|
Daniel@0
|
429 protected $defaultLocale ='en';
|
Daniel@0
|
430 protected static $formats;
|
Daniel@0
|
431 protected static $requestFactory;
|
Daniel@0
|
432 public function __construct(array $query = array(), array $request = array(), array $attributes = array(), array $cookies = array(), array $files = array(), array $server = array(), $content = null)
|
Daniel@0
|
433 {
|
Daniel@0
|
434 $this->initialize($query, $request, $attributes, $cookies, $files, $server, $content);
|
Daniel@0
|
435 }
|
Daniel@0
|
436 public function initialize(array $query = array(), array $request = array(), array $attributes = array(), array $cookies = array(), array $files = array(), array $server = array(), $content = null)
|
Daniel@0
|
437 {
|
Daniel@0
|
438 $this->request = new ParameterBag($request);
|
Daniel@0
|
439 $this->query = new ParameterBag($query);
|
Daniel@0
|
440 $this->attributes = new ParameterBag($attributes);
|
Daniel@0
|
441 $this->cookies = new ParameterBag($cookies);
|
Daniel@0
|
442 $this->files = new FileBag($files);
|
Daniel@0
|
443 $this->server = new ServerBag($server);
|
Daniel@0
|
444 $this->headers = new HeaderBag($this->server->getHeaders());
|
Daniel@0
|
445 $this->content = $content;
|
Daniel@0
|
446 $this->languages = null;
|
Daniel@0
|
447 $this->charsets = null;
|
Daniel@0
|
448 $this->encodings = null;
|
Daniel@0
|
449 $this->acceptableContentTypes = null;
|
Daniel@0
|
450 $this->pathInfo = null;
|
Daniel@0
|
451 $this->requestUri = null;
|
Daniel@0
|
452 $this->baseUrl = null;
|
Daniel@0
|
453 $this->basePath = null;
|
Daniel@0
|
454 $this->method = null;
|
Daniel@0
|
455 $this->format = null;
|
Daniel@0
|
456 }
|
Daniel@0
|
457 public static function createFromGlobals()
|
Daniel@0
|
458 {
|
Daniel@0
|
459 $server = $_SERVER;
|
Daniel@0
|
460 if ('cli-server'=== php_sapi_name()) {
|
Daniel@0
|
461 if (array_key_exists('HTTP_CONTENT_LENGTH', $_SERVER)) {
|
Daniel@0
|
462 $server['CONTENT_LENGTH'] = $_SERVER['HTTP_CONTENT_LENGTH'];
|
Daniel@0
|
463 }
|
Daniel@0
|
464 if (array_key_exists('HTTP_CONTENT_TYPE', $_SERVER)) {
|
Daniel@0
|
465 $server['CONTENT_TYPE'] = $_SERVER['HTTP_CONTENT_TYPE'];
|
Daniel@0
|
466 }
|
Daniel@0
|
467 }
|
Daniel@0
|
468 $request = self::createRequestFromFactory($_GET, $_POST, array(), $_COOKIE, $_FILES, $server);
|
Daniel@0
|
469 if (0 === strpos($request->headers->get('CONTENT_TYPE'),'application/x-www-form-urlencoded')
|
Daniel@0
|
470 && in_array(strtoupper($request->server->get('REQUEST_METHOD','GET')), array('PUT','DELETE','PATCH'))
|
Daniel@0
|
471 ) {
|
Daniel@0
|
472 parse_str($request->getContent(), $data);
|
Daniel@0
|
473 $request->request = new ParameterBag($data);
|
Daniel@0
|
474 }
|
Daniel@0
|
475 return $request;
|
Daniel@0
|
476 }
|
Daniel@0
|
477 public static function create($uri, $method ='GET', $parameters = array(), $cookies = array(), $files = array(), $server = array(), $content = null)
|
Daniel@0
|
478 {
|
Daniel@0
|
479 $server = array_replace(array('SERVER_NAME'=>'localhost','SERVER_PORT'=> 80,'HTTP_HOST'=>'localhost','HTTP_USER_AGENT'=>'Symfony/2.X','HTTP_ACCEPT'=>'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8','HTTP_ACCEPT_LANGUAGE'=>'en-us,en;q=0.5','HTTP_ACCEPT_CHARSET'=>'ISO-8859-1,utf-8;q=0.7,*;q=0.7','REMOTE_ADDR'=>'127.0.0.1','SCRIPT_NAME'=>'','SCRIPT_FILENAME'=>'','SERVER_PROTOCOL'=>'HTTP/1.1','REQUEST_TIME'=> time(),
|
Daniel@0
|
480 ), $server);
|
Daniel@0
|
481 $server['PATH_INFO'] ='';
|
Daniel@0
|
482 $server['REQUEST_METHOD'] = strtoupper($method);
|
Daniel@0
|
483 $components = parse_url($uri);
|
Daniel@0
|
484 if (isset($components['host'])) {
|
Daniel@0
|
485 $server['SERVER_NAME'] = $components['host'];
|
Daniel@0
|
486 $server['HTTP_HOST'] = $components['host'];
|
Daniel@0
|
487 }
|
Daniel@0
|
488 if (isset($components['scheme'])) {
|
Daniel@0
|
489 if ('https'=== $components['scheme']) {
|
Daniel@0
|
490 $server['HTTPS'] ='on';
|
Daniel@0
|
491 $server['SERVER_PORT'] = 443;
|
Daniel@0
|
492 } else {
|
Daniel@0
|
493 unset($server['HTTPS']);
|
Daniel@0
|
494 $server['SERVER_PORT'] = 80;
|
Daniel@0
|
495 }
|
Daniel@0
|
496 }
|
Daniel@0
|
497 if (isset($components['port'])) {
|
Daniel@0
|
498 $server['SERVER_PORT'] = $components['port'];
|
Daniel@0
|
499 $server['HTTP_HOST'] = $server['HTTP_HOST'].':'.$components['port'];
|
Daniel@0
|
500 }
|
Daniel@0
|
501 if (isset($components['user'])) {
|
Daniel@0
|
502 $server['PHP_AUTH_USER'] = $components['user'];
|
Daniel@0
|
503 }
|
Daniel@0
|
504 if (isset($components['pass'])) {
|
Daniel@0
|
505 $server['PHP_AUTH_PW'] = $components['pass'];
|
Daniel@0
|
506 }
|
Daniel@0
|
507 if (!isset($components['path'])) {
|
Daniel@0
|
508 $components['path'] ='/';
|
Daniel@0
|
509 }
|
Daniel@0
|
510 switch (strtoupper($method)) {
|
Daniel@0
|
511 case'POST':
|
Daniel@0
|
512 case'PUT':
|
Daniel@0
|
513 case'DELETE':
|
Daniel@0
|
514 if (!isset($server['CONTENT_TYPE'])) {
|
Daniel@0
|
515 $server['CONTENT_TYPE'] ='application/x-www-form-urlencoded';
|
Daniel@0
|
516 }
|
Daniel@0
|
517 case'PATCH':
|
Daniel@0
|
518 $request = $parameters;
|
Daniel@0
|
519 $query = array();
|
Daniel@0
|
520 break;
|
Daniel@0
|
521 default:
|
Daniel@0
|
522 $request = array();
|
Daniel@0
|
523 $query = $parameters;
|
Daniel@0
|
524 break;
|
Daniel@0
|
525 }
|
Daniel@0
|
526 $queryString ='';
|
Daniel@0
|
527 if (isset($components['query'])) {
|
Daniel@0
|
528 parse_str(html_entity_decode($components['query']), $qs);
|
Daniel@0
|
529 if ($query) {
|
Daniel@0
|
530 $query = array_replace($qs, $query);
|
Daniel@0
|
531 $queryString = http_build_query($query,'','&');
|
Daniel@0
|
532 } else {
|
Daniel@0
|
533 $query = $qs;
|
Daniel@0
|
534 $queryString = $components['query'];
|
Daniel@0
|
535 }
|
Daniel@0
|
536 } elseif ($query) {
|
Daniel@0
|
537 $queryString = http_build_query($query,'','&');
|
Daniel@0
|
538 }
|
Daniel@0
|
539 $server['REQUEST_URI'] = $components['path'].(''!== $queryString ?'?'.$queryString :'');
|
Daniel@0
|
540 $server['QUERY_STRING'] = $queryString;
|
Daniel@0
|
541 return self::createRequestFromFactory($query, $request, array(), $cookies, $files, $server, $content);
|
Daniel@0
|
542 }
|
Daniel@0
|
543 public static function setFactory($callable)
|
Daniel@0
|
544 {
|
Daniel@0
|
545 self::$requestFactory = $callable;
|
Daniel@0
|
546 }
|
Daniel@0
|
547 public function duplicate(array $query = null, array $request = null, array $attributes = null, array $cookies = null, array $files = null, array $server = null)
|
Daniel@0
|
548 {
|
Daniel@0
|
549 $dup = clone $this;
|
Daniel@0
|
550 if ($query !== null) {
|
Daniel@0
|
551 $dup->query = new ParameterBag($query);
|
Daniel@0
|
552 }
|
Daniel@0
|
553 if ($request !== null) {
|
Daniel@0
|
554 $dup->request = new ParameterBag($request);
|
Daniel@0
|
555 }
|
Daniel@0
|
556 if ($attributes !== null) {
|
Daniel@0
|
557 $dup->attributes = new ParameterBag($attributes);
|
Daniel@0
|
558 }
|
Daniel@0
|
559 if ($cookies !== null) {
|
Daniel@0
|
560 $dup->cookies = new ParameterBag($cookies);
|
Daniel@0
|
561 }
|
Daniel@0
|
562 if ($files !== null) {
|
Daniel@0
|
563 $dup->files = new FileBag($files);
|
Daniel@0
|
564 }
|
Daniel@0
|
565 if ($server !== null) {
|
Daniel@0
|
566 $dup->server = new ServerBag($server);
|
Daniel@0
|
567 $dup->headers = new HeaderBag($dup->server->getHeaders());
|
Daniel@0
|
568 }
|
Daniel@0
|
569 $dup->languages = null;
|
Daniel@0
|
570 $dup->charsets = null;
|
Daniel@0
|
571 $dup->encodings = null;
|
Daniel@0
|
572 $dup->acceptableContentTypes = null;
|
Daniel@0
|
573 $dup->pathInfo = null;
|
Daniel@0
|
574 $dup->requestUri = null;
|
Daniel@0
|
575 $dup->baseUrl = null;
|
Daniel@0
|
576 $dup->basePath = null;
|
Daniel@0
|
577 $dup->method = null;
|
Daniel@0
|
578 $dup->format = null;
|
Daniel@0
|
579 if (!$dup->get('_format') && $this->get('_format')) {
|
Daniel@0
|
580 $dup->attributes->set('_format', $this->get('_format'));
|
Daniel@0
|
581 }
|
Daniel@0
|
582 if (!$dup->getRequestFormat(null)) {
|
Daniel@0
|
583 $dup->setRequestFormat($this->getRequestFormat(null));
|
Daniel@0
|
584 }
|
Daniel@0
|
585 return $dup;
|
Daniel@0
|
586 }
|
Daniel@0
|
587 public function __clone()
|
Daniel@0
|
588 {
|
Daniel@0
|
589 $this->query = clone $this->query;
|
Daniel@0
|
590 $this->request = clone $this->request;
|
Daniel@0
|
591 $this->attributes = clone $this->attributes;
|
Daniel@0
|
592 $this->cookies = clone $this->cookies;
|
Daniel@0
|
593 $this->files = clone $this->files;
|
Daniel@0
|
594 $this->server = clone $this->server;
|
Daniel@0
|
595 $this->headers = clone $this->headers;
|
Daniel@0
|
596 }
|
Daniel@0
|
597 public function __toString()
|
Daniel@0
|
598 {
|
Daniel@0
|
599 return
|
Daniel@0
|
600 sprintf('%s %s %s', $this->getMethod(), $this->getRequestUri(), $this->server->get('SERVER_PROTOCOL'))."\r\n".
|
Daniel@0
|
601 $this->headers."\r\n".
|
Daniel@0
|
602 $this->getContent();
|
Daniel@0
|
603 }
|
Daniel@0
|
604 public function overrideGlobals()
|
Daniel@0
|
605 {
|
Daniel@0
|
606 $this->server->set('QUERY_STRING', static::normalizeQueryString(http_build_query($this->query->all(), null,'&')));
|
Daniel@0
|
607 $_GET = $this->query->all();
|
Daniel@0
|
608 $_POST = $this->request->all();
|
Daniel@0
|
609 $_SERVER = $this->server->all();
|
Daniel@0
|
610 $_COOKIE = $this->cookies->all();
|
Daniel@0
|
611 foreach ($this->headers->all() as $key => $value) {
|
Daniel@0
|
612 $key = strtoupper(str_replace('-','_', $key));
|
Daniel@0
|
613 if (in_array($key, array('CONTENT_TYPE','CONTENT_LENGTH'))) {
|
Daniel@0
|
614 $_SERVER[$key] = implode(', ', $value);
|
Daniel@0
|
615 } else {
|
Daniel@0
|
616 $_SERVER['HTTP_'.$key] = implode(', ', $value);
|
Daniel@0
|
617 }
|
Daniel@0
|
618 }
|
Daniel@0
|
619 $request = array('g'=> $_GET,'p'=> $_POST,'c'=> $_COOKIE);
|
Daniel@0
|
620 $requestOrder = ini_get('request_order') ?: ini_get('variables_order');
|
Daniel@0
|
621 $requestOrder = preg_replace('#[^cgp]#','', strtolower($requestOrder)) ?:'gp';
|
Daniel@0
|
622 $_REQUEST = array();
|
Daniel@0
|
623 foreach (str_split($requestOrder) as $order) {
|
Daniel@0
|
624 $_REQUEST = array_merge($_REQUEST, $request[$order]);
|
Daniel@0
|
625 }
|
Daniel@0
|
626 }
|
Daniel@0
|
627 public static function setTrustedProxies(array $proxies)
|
Daniel@0
|
628 {
|
Daniel@0
|
629 self::$trustedProxies = $proxies;
|
Daniel@0
|
630 }
|
Daniel@0
|
631 public static function getTrustedProxies()
|
Daniel@0
|
632 {
|
Daniel@0
|
633 return self::$trustedProxies;
|
Daniel@0
|
634 }
|
Daniel@0
|
635 public static function setTrustedHosts(array $hostPatterns)
|
Daniel@0
|
636 {
|
Daniel@0
|
637 self::$trustedHostPatterns = array_map(function ($hostPattern) {
|
Daniel@0
|
638 return sprintf('{%s}i', str_replace('}','\\}', $hostPattern));
|
Daniel@0
|
639 }, $hostPatterns);
|
Daniel@0
|
640 self::$trustedHosts = array();
|
Daniel@0
|
641 }
|
Daniel@0
|
642 public static function getTrustedHosts()
|
Daniel@0
|
643 {
|
Daniel@0
|
644 return self::$trustedHostPatterns;
|
Daniel@0
|
645 }
|
Daniel@0
|
646 public static function setTrustedHeaderName($key, $value)
|
Daniel@0
|
647 {
|
Daniel@0
|
648 if (!array_key_exists($key, self::$trustedHeaders)) {
|
Daniel@0
|
649 throw new \InvalidArgumentException(sprintf('Unable to set the trusted header name for key "%s".', $key));
|
Daniel@0
|
650 }
|
Daniel@0
|
651 self::$trustedHeaders[$key] = $value;
|
Daniel@0
|
652 }
|
Daniel@0
|
653 public static function getTrustedHeaderName($key)
|
Daniel@0
|
654 {
|
Daniel@0
|
655 if (!array_key_exists($key, self::$trustedHeaders)) {
|
Daniel@0
|
656 throw new \InvalidArgumentException(sprintf('Unable to get the trusted header name for key "%s".', $key));
|
Daniel@0
|
657 }
|
Daniel@0
|
658 return self::$trustedHeaders[$key];
|
Daniel@0
|
659 }
|
Daniel@0
|
660 public static function normalizeQueryString($qs)
|
Daniel@0
|
661 {
|
Daniel@0
|
662 if (''== $qs) {
|
Daniel@0
|
663 return'';
|
Daniel@0
|
664 }
|
Daniel@0
|
665 $parts = array();
|
Daniel@0
|
666 $order = array();
|
Daniel@0
|
667 foreach (explode('&', $qs) as $param) {
|
Daniel@0
|
668 if (''=== $param ||'='=== $param[0]) {
|
Daniel@0
|
669 continue;
|
Daniel@0
|
670 }
|
Daniel@0
|
671 $keyValuePair = explode('=', $param, 2);
|
Daniel@0
|
672 $parts[] = isset($keyValuePair[1]) ?
|
Daniel@0
|
673 rawurlencode(urldecode($keyValuePair[0])).'='.rawurlencode(urldecode($keyValuePair[1])) :
|
Daniel@0
|
674 rawurlencode(urldecode($keyValuePair[0]));
|
Daniel@0
|
675 $order[] = urldecode($keyValuePair[0]);
|
Daniel@0
|
676 }
|
Daniel@0
|
677 array_multisort($order, SORT_ASC, $parts);
|
Daniel@0
|
678 return implode('&', $parts);
|
Daniel@0
|
679 }
|
Daniel@0
|
680 public static function enableHttpMethodParameterOverride()
|
Daniel@0
|
681 {
|
Daniel@0
|
682 self::$httpMethodParameterOverride = true;
|
Daniel@0
|
683 }
|
Daniel@0
|
684 public static function getHttpMethodParameterOverride()
|
Daniel@0
|
685 {
|
Daniel@0
|
686 return self::$httpMethodParameterOverride;
|
Daniel@0
|
687 }
|
Daniel@0
|
688 public function get($key, $default = null, $deep = false)
|
Daniel@0
|
689 {
|
Daniel@0
|
690 if ($this !== $result = $this->query->get($key, $this, $deep)) {
|
Daniel@0
|
691 return $result;
|
Daniel@0
|
692 }
|
Daniel@0
|
693 if ($this !== $result = $this->attributes->get($key, $this, $deep)) {
|
Daniel@0
|
694 return $result;
|
Daniel@0
|
695 }
|
Daniel@0
|
696 if ($this !== $result = $this->request->get($key, $this, $deep)) {
|
Daniel@0
|
697 return $result;
|
Daniel@0
|
698 }
|
Daniel@0
|
699 return $default;
|
Daniel@0
|
700 }
|
Daniel@0
|
701 public function getSession()
|
Daniel@0
|
702 {
|
Daniel@0
|
703 return $this->session;
|
Daniel@0
|
704 }
|
Daniel@0
|
705 public function hasPreviousSession()
|
Daniel@0
|
706 {
|
Daniel@0
|
707 return $this->hasSession() && $this->cookies->has($this->session->getName());
|
Daniel@0
|
708 }
|
Daniel@0
|
709 public function hasSession()
|
Daniel@0
|
710 {
|
Daniel@0
|
711 return null !== $this->session;
|
Daniel@0
|
712 }
|
Daniel@0
|
713 public function setSession(SessionInterface $session)
|
Daniel@0
|
714 {
|
Daniel@0
|
715 $this->session = $session;
|
Daniel@0
|
716 }
|
Daniel@0
|
717 public function getClientIps()
|
Daniel@0
|
718 {
|
Daniel@0
|
719 $ip = $this->server->get('REMOTE_ADDR');
|
Daniel@0
|
720 if (!self::$trustedProxies) {
|
Daniel@0
|
721 return array($ip);
|
Daniel@0
|
722 }
|
Daniel@0
|
723 if (!self::$trustedHeaders[self::HEADER_CLIENT_IP] || !$this->headers->has(self::$trustedHeaders[self::HEADER_CLIENT_IP])) {
|
Daniel@0
|
724 return array($ip);
|
Daniel@0
|
725 }
|
Daniel@0
|
726 $clientIps = array_map('trim', explode(',', $this->headers->get(self::$trustedHeaders[self::HEADER_CLIENT_IP])));
|
Daniel@0
|
727 $clientIps[] = $ip;
|
Daniel@0
|
728 $ip = $clientIps[0];
|
Daniel@0
|
729 foreach ($clientIps as $key => $clientIp) {
|
Daniel@0
|
730 if (preg_match('{((?:\d+\.){3}\d+)\:\d+}', $clientIp, $match)) {
|
Daniel@0
|
731 $clientIps[$key] = $clientIp = $match[1];
|
Daniel@0
|
732 }
|
Daniel@0
|
733 if (IpUtils::checkIp($clientIp, self::$trustedProxies)) {
|
Daniel@0
|
734 unset($clientIps[$key]);
|
Daniel@0
|
735 }
|
Daniel@0
|
736 }
|
Daniel@0
|
737 return $clientIps ? array_reverse($clientIps) : array($ip);
|
Daniel@0
|
738 }
|
Daniel@0
|
739 public function getClientIp()
|
Daniel@0
|
740 {
|
Daniel@0
|
741 $ipAddresses = $this->getClientIps();
|
Daniel@0
|
742 return $ipAddresses[0];
|
Daniel@0
|
743 }
|
Daniel@0
|
744 public function getScriptName()
|
Daniel@0
|
745 {
|
Daniel@0
|
746 return $this->server->get('SCRIPT_NAME', $this->server->get('ORIG_SCRIPT_NAME',''));
|
Daniel@0
|
747 }
|
Daniel@0
|
748 public function getPathInfo()
|
Daniel@0
|
749 {
|
Daniel@0
|
750 if (null === $this->pathInfo) {
|
Daniel@0
|
751 $this->pathInfo = $this->preparePathInfo();
|
Daniel@0
|
752 }
|
Daniel@0
|
753 return $this->pathInfo;
|
Daniel@0
|
754 }
|
Daniel@0
|
755 public function getBasePath()
|
Daniel@0
|
756 {
|
Daniel@0
|
757 if (null === $this->basePath) {
|
Daniel@0
|
758 $this->basePath = $this->prepareBasePath();
|
Daniel@0
|
759 }
|
Daniel@0
|
760 return $this->basePath;
|
Daniel@0
|
761 }
|
Daniel@0
|
762 public function getBaseUrl()
|
Daniel@0
|
763 {
|
Daniel@0
|
764 if (null === $this->baseUrl) {
|
Daniel@0
|
765 $this->baseUrl = $this->prepareBaseUrl();
|
Daniel@0
|
766 }
|
Daniel@0
|
767 return $this->baseUrl;
|
Daniel@0
|
768 }
|
Daniel@0
|
769 public function getScheme()
|
Daniel@0
|
770 {
|
Daniel@0
|
771 return $this->isSecure() ?'https':'http';
|
Daniel@0
|
772 }
|
Daniel@0
|
773 public function getPort()
|
Daniel@0
|
774 {
|
Daniel@0
|
775 if (self::$trustedProxies) {
|
Daniel@0
|
776 if (self::$trustedHeaders[self::HEADER_CLIENT_PORT] && $port = $this->headers->get(self::$trustedHeaders[self::HEADER_CLIENT_PORT])) {
|
Daniel@0
|
777 return $port;
|
Daniel@0
|
778 }
|
Daniel@0
|
779 if (self::$trustedHeaders[self::HEADER_CLIENT_PROTO] &&'https'=== $this->headers->get(self::$trustedHeaders[self::HEADER_CLIENT_PROTO],'http')) {
|
Daniel@0
|
780 return 443;
|
Daniel@0
|
781 }
|
Daniel@0
|
782 }
|
Daniel@0
|
783 if ($host = $this->headers->get('HOST')) {
|
Daniel@0
|
784 if ($host[0] ==='[') {
|
Daniel@0
|
785 $pos = strpos($host,':', strrpos($host,']'));
|
Daniel@0
|
786 } else {
|
Daniel@0
|
787 $pos = strrpos($host,':');
|
Daniel@0
|
788 }
|
Daniel@0
|
789 if (false !== $pos) {
|
Daniel@0
|
790 return intval(substr($host, $pos + 1));
|
Daniel@0
|
791 }
|
Daniel@0
|
792 return'https'=== $this->getScheme() ? 443 : 80;
|
Daniel@0
|
793 }
|
Daniel@0
|
794 return $this->server->get('SERVER_PORT');
|
Daniel@0
|
795 }
|
Daniel@0
|
796 public function getUser()
|
Daniel@0
|
797 {
|
Daniel@0
|
798 return $this->headers->get('PHP_AUTH_USER');
|
Daniel@0
|
799 }
|
Daniel@0
|
800 public function getPassword()
|
Daniel@0
|
801 {
|
Daniel@0
|
802 return $this->headers->get('PHP_AUTH_PW');
|
Daniel@0
|
803 }
|
Daniel@0
|
804 public function getUserInfo()
|
Daniel@0
|
805 {
|
Daniel@0
|
806 $userinfo = $this->getUser();
|
Daniel@0
|
807 $pass = $this->getPassword();
|
Daniel@0
|
808 if (''!= $pass) {
|
Daniel@0
|
809 $userinfo .= ":$pass";
|
Daniel@0
|
810 }
|
Daniel@0
|
811 return $userinfo;
|
Daniel@0
|
812 }
|
Daniel@0
|
813 public function getHttpHost()
|
Daniel@0
|
814 {
|
Daniel@0
|
815 $scheme = $this->getScheme();
|
Daniel@0
|
816 $port = $this->getPort();
|
Daniel@0
|
817 if (('http'== $scheme && $port == 80) || ('https'== $scheme && $port == 443)) {
|
Daniel@0
|
818 return $this->getHost();
|
Daniel@0
|
819 }
|
Daniel@0
|
820 return $this->getHost().':'.$port;
|
Daniel@0
|
821 }
|
Daniel@0
|
822 public function getRequestUri()
|
Daniel@0
|
823 {
|
Daniel@0
|
824 if (null === $this->requestUri) {
|
Daniel@0
|
825 $this->requestUri = $this->prepareRequestUri();
|
Daniel@0
|
826 }
|
Daniel@0
|
827 return $this->requestUri;
|
Daniel@0
|
828 }
|
Daniel@0
|
829 public function getSchemeAndHttpHost()
|
Daniel@0
|
830 {
|
Daniel@0
|
831 return $this->getScheme().'://'.$this->getHttpHost();
|
Daniel@0
|
832 }
|
Daniel@0
|
833 public function getUri()
|
Daniel@0
|
834 {
|
Daniel@0
|
835 if (null !== $qs = $this->getQueryString()) {
|
Daniel@0
|
836 $qs ='?'.$qs;
|
Daniel@0
|
837 }
|
Daniel@0
|
838 return $this->getSchemeAndHttpHost().$this->getBaseUrl().$this->getPathInfo().$qs;
|
Daniel@0
|
839 }
|
Daniel@0
|
840 public function getUriForPath($path)
|
Daniel@0
|
841 {
|
Daniel@0
|
842 return $this->getSchemeAndHttpHost().$this->getBaseUrl().$path;
|
Daniel@0
|
843 }
|
Daniel@0
|
844 public function getQueryString()
|
Daniel@0
|
845 {
|
Daniel@0
|
846 $qs = static::normalizeQueryString($this->server->get('QUERY_STRING'));
|
Daniel@0
|
847 return''=== $qs ? null : $qs;
|
Daniel@0
|
848 }
|
Daniel@0
|
849 public function isSecure()
|
Daniel@0
|
850 {
|
Daniel@0
|
851 if (self::$trustedProxies && self::$trustedHeaders[self::HEADER_CLIENT_PROTO] && $proto = $this->headers->get(self::$trustedHeaders[self::HEADER_CLIENT_PROTO])) {
|
Daniel@0
|
852 return in_array(strtolower(current(explode(',', $proto))), array('https','on','ssl','1'));
|
Daniel@0
|
853 }
|
Daniel@0
|
854 $https = $this->server->get('HTTPS');
|
Daniel@0
|
855 return !empty($https) &&'off'!== strtolower($https);
|
Daniel@0
|
856 }
|
Daniel@0
|
857 public function getHost()
|
Daniel@0
|
858 {
|
Daniel@0
|
859 if (self::$trustedProxies && self::$trustedHeaders[self::HEADER_CLIENT_HOST] && $host = $this->headers->get(self::$trustedHeaders[self::HEADER_CLIENT_HOST])) {
|
Daniel@0
|
860 $elements = explode(',', $host);
|
Daniel@0
|
861 $host = $elements[count($elements) - 1];
|
Daniel@0
|
862 } elseif (!$host = $this->headers->get('HOST')) {
|
Daniel@0
|
863 if (!$host = $this->server->get('SERVER_NAME')) {
|
Daniel@0
|
864 $host = $this->server->get('SERVER_ADDR','');
|
Daniel@0
|
865 }
|
Daniel@0
|
866 }
|
Daniel@0
|
867 $host = strtolower(preg_replace('/:\d+$/','', trim($host)));
|
Daniel@0
|
868 if ($host &&''!== preg_replace('/(?:^\[)?[a-zA-Z0-9-:\]_]+\.?/','', $host)) {
|
Daniel@0
|
869 throw new \UnexpectedValueException(sprintf('Invalid Host "%s"', $host));
|
Daniel@0
|
870 }
|
Daniel@0
|
871 if (count(self::$trustedHostPatterns) > 0) {
|
Daniel@0
|
872 if (in_array($host, self::$trustedHosts)) {
|
Daniel@0
|
873 return $host;
|
Daniel@0
|
874 }
|
Daniel@0
|
875 foreach (self::$trustedHostPatterns as $pattern) {
|
Daniel@0
|
876 if (preg_match($pattern, $host)) {
|
Daniel@0
|
877 self::$trustedHosts[] = $host;
|
Daniel@0
|
878 return $host;
|
Daniel@0
|
879 }
|
Daniel@0
|
880 }
|
Daniel@0
|
881 throw new \UnexpectedValueException(sprintf('Untrusted Host "%s"', $host));
|
Daniel@0
|
882 }
|
Daniel@0
|
883 return $host;
|
Daniel@0
|
884 }
|
Daniel@0
|
885 public function setMethod($method)
|
Daniel@0
|
886 {
|
Daniel@0
|
887 $this->method = null;
|
Daniel@0
|
888 $this->server->set('REQUEST_METHOD', $method);
|
Daniel@0
|
889 }
|
Daniel@0
|
890 public function getMethod()
|
Daniel@0
|
891 {
|
Daniel@0
|
892 if (null === $this->method) {
|
Daniel@0
|
893 $this->method = strtoupper($this->server->get('REQUEST_METHOD','GET'));
|
Daniel@0
|
894 if ('POST'=== $this->method) {
|
Daniel@0
|
895 if ($method = $this->headers->get('X-HTTP-METHOD-OVERRIDE')) {
|
Daniel@0
|
896 $this->method = strtoupper($method);
|
Daniel@0
|
897 } elseif (self::$httpMethodParameterOverride) {
|
Daniel@0
|
898 $this->method = strtoupper($this->request->get('_method', $this->query->get('_method','POST')));
|
Daniel@0
|
899 }
|
Daniel@0
|
900 }
|
Daniel@0
|
901 }
|
Daniel@0
|
902 return $this->method;
|
Daniel@0
|
903 }
|
Daniel@0
|
904 public function getRealMethod()
|
Daniel@0
|
905 {
|
Daniel@0
|
906 return strtoupper($this->server->get('REQUEST_METHOD','GET'));
|
Daniel@0
|
907 }
|
Daniel@0
|
908 public function getMimeType($format)
|
Daniel@0
|
909 {
|
Daniel@0
|
910 if (null === static::$formats) {
|
Daniel@0
|
911 static::initializeFormats();
|
Daniel@0
|
912 }
|
Daniel@0
|
913 return isset(static::$formats[$format]) ? static::$formats[$format][0] : null;
|
Daniel@0
|
914 }
|
Daniel@0
|
915 public function getFormat($mimeType)
|
Daniel@0
|
916 {
|
Daniel@0
|
917 if (false !== $pos = strpos($mimeType,';')) {
|
Daniel@0
|
918 $mimeType = substr($mimeType, 0, $pos);
|
Daniel@0
|
919 }
|
Daniel@0
|
920 if (null === static::$formats) {
|
Daniel@0
|
921 static::initializeFormats();
|
Daniel@0
|
922 }
|
Daniel@0
|
923 foreach (static::$formats as $format => $mimeTypes) {
|
Daniel@0
|
924 if (in_array($mimeType, (array) $mimeTypes)) {
|
Daniel@0
|
925 return $format;
|
Daniel@0
|
926 }
|
Daniel@0
|
927 }
|
Daniel@0
|
928 }
|
Daniel@0
|
929 public function setFormat($format, $mimeTypes)
|
Daniel@0
|
930 {
|
Daniel@0
|
931 if (null === static::$formats) {
|
Daniel@0
|
932 static::initializeFormats();
|
Daniel@0
|
933 }
|
Daniel@0
|
934 static::$formats[$format] = is_array($mimeTypes) ? $mimeTypes : array($mimeTypes);
|
Daniel@0
|
935 }
|
Daniel@0
|
936 public function getRequestFormat($default ='html')
|
Daniel@0
|
937 {
|
Daniel@0
|
938 if (null === $this->format) {
|
Daniel@0
|
939 $this->format = $this->get('_format', $default);
|
Daniel@0
|
940 }
|
Daniel@0
|
941 return $this->format;
|
Daniel@0
|
942 }
|
Daniel@0
|
943 public function setRequestFormat($format)
|
Daniel@0
|
944 {
|
Daniel@0
|
945 $this->format = $format;
|
Daniel@0
|
946 }
|
Daniel@0
|
947 public function getContentType()
|
Daniel@0
|
948 {
|
Daniel@0
|
949 return $this->getFormat($this->headers->get('CONTENT_TYPE'));
|
Daniel@0
|
950 }
|
Daniel@0
|
951 public function setDefaultLocale($locale)
|
Daniel@0
|
952 {
|
Daniel@0
|
953 $this->defaultLocale = $locale;
|
Daniel@0
|
954 if (null === $this->locale) {
|
Daniel@0
|
955 $this->setPhpDefaultLocale($locale);
|
Daniel@0
|
956 }
|
Daniel@0
|
957 }
|
Daniel@0
|
958 public function getDefaultLocale()
|
Daniel@0
|
959 {
|
Daniel@0
|
960 return $this->defaultLocale;
|
Daniel@0
|
961 }
|
Daniel@0
|
962 public function setLocale($locale)
|
Daniel@0
|
963 {
|
Daniel@0
|
964 $this->setPhpDefaultLocale($this->locale = $locale);
|
Daniel@0
|
965 }
|
Daniel@0
|
966 public function getLocale()
|
Daniel@0
|
967 {
|
Daniel@0
|
968 return null === $this->locale ? $this->defaultLocale : $this->locale;
|
Daniel@0
|
969 }
|
Daniel@0
|
970 public function isMethod($method)
|
Daniel@0
|
971 {
|
Daniel@0
|
972 return $this->getMethod() === strtoupper($method);
|
Daniel@0
|
973 }
|
Daniel@0
|
974 public function isMethodSafe()
|
Daniel@0
|
975 {
|
Daniel@0
|
976 return in_array($this->getMethod(), array('GET','HEAD'));
|
Daniel@0
|
977 }
|
Daniel@0
|
978 public function getContent($asResource = false)
|
Daniel@0
|
979 {
|
Daniel@0
|
980 if (false === $this->content || (true === $asResource && null !== $this->content)) {
|
Daniel@0
|
981 throw new \LogicException('getContent() can only be called once when using the resource return type.');
|
Daniel@0
|
982 }
|
Daniel@0
|
983 if (true === $asResource) {
|
Daniel@0
|
984 $this->content = false;
|
Daniel@0
|
985 return fopen('php://input','rb');
|
Daniel@0
|
986 }
|
Daniel@0
|
987 if (null === $this->content) {
|
Daniel@0
|
988 $this->content = file_get_contents('php://input');
|
Daniel@0
|
989 }
|
Daniel@0
|
990 return $this->content;
|
Daniel@0
|
991 }
|
Daniel@0
|
992 public function getETags()
|
Daniel@0
|
993 {
|
Daniel@0
|
994 return preg_split('/\s*,\s*/', $this->headers->get('if_none_match'), null, PREG_SPLIT_NO_EMPTY);
|
Daniel@0
|
995 }
|
Daniel@0
|
996 public function isNoCache()
|
Daniel@0
|
997 {
|
Daniel@0
|
998 return $this->headers->hasCacheControlDirective('no-cache') ||'no-cache'== $this->headers->get('Pragma');
|
Daniel@0
|
999 }
|
Daniel@0
|
1000 public function getPreferredLanguage(array $locales = null)
|
Daniel@0
|
1001 {
|
Daniel@0
|
1002 $preferredLanguages = $this->getLanguages();
|
Daniel@0
|
1003 if (empty($locales)) {
|
Daniel@0
|
1004 return isset($preferredLanguages[0]) ? $preferredLanguages[0] : null;
|
Daniel@0
|
1005 }
|
Daniel@0
|
1006 if (!$preferredLanguages) {
|
Daniel@0
|
1007 return $locales[0];
|
Daniel@0
|
1008 }
|
Daniel@0
|
1009 $extendedPreferredLanguages = array();
|
Daniel@0
|
1010 foreach ($preferredLanguages as $language) {
|
Daniel@0
|
1011 $extendedPreferredLanguages[] = $language;
|
Daniel@0
|
1012 if (false !== $position = strpos($language,'_')) {
|
Daniel@0
|
1013 $superLanguage = substr($language, 0, $position);
|
Daniel@0
|
1014 if (!in_array($superLanguage, $preferredLanguages)) {
|
Daniel@0
|
1015 $extendedPreferredLanguages[] = $superLanguage;
|
Daniel@0
|
1016 }
|
Daniel@0
|
1017 }
|
Daniel@0
|
1018 }
|
Daniel@0
|
1019 $preferredLanguages = array_values(array_intersect($extendedPreferredLanguages, $locales));
|
Daniel@0
|
1020 return isset($preferredLanguages[0]) ? $preferredLanguages[0] : $locales[0];
|
Daniel@0
|
1021 }
|
Daniel@0
|
1022 public function getLanguages()
|
Daniel@0
|
1023 {
|
Daniel@0
|
1024 if (null !== $this->languages) {
|
Daniel@0
|
1025 return $this->languages;
|
Daniel@0
|
1026 }
|
Daniel@0
|
1027 $languages = AcceptHeader::fromString($this->headers->get('Accept-Language'))->all();
|
Daniel@0
|
1028 $this->languages = array();
|
Daniel@0
|
1029 foreach (array_keys($languages) as $lang) {
|
Daniel@0
|
1030 if (strstr($lang,'-')) {
|
Daniel@0
|
1031 $codes = explode('-', $lang);
|
Daniel@0
|
1032 if ($codes[0] =='i') {
|
Daniel@0
|
1033 if (count($codes) > 1) {
|
Daniel@0
|
1034 $lang = $codes[1];
|
Daniel@0
|
1035 }
|
Daniel@0
|
1036 } else {
|
Daniel@0
|
1037 for ($i = 0, $max = count($codes); $i < $max; $i++) {
|
Daniel@0
|
1038 if ($i == 0) {
|
Daniel@0
|
1039 $lang = strtolower($codes[0]);
|
Daniel@0
|
1040 } else {
|
Daniel@0
|
1041 $lang .='_'.strtoupper($codes[$i]);
|
Daniel@0
|
1042 }
|
Daniel@0
|
1043 }
|
Daniel@0
|
1044 }
|
Daniel@0
|
1045 }
|
Daniel@0
|
1046 $this->languages[] = $lang;
|
Daniel@0
|
1047 }
|
Daniel@0
|
1048 return $this->languages;
|
Daniel@0
|
1049 }
|
Daniel@0
|
1050 public function getCharsets()
|
Daniel@0
|
1051 {
|
Daniel@0
|
1052 if (null !== $this->charsets) {
|
Daniel@0
|
1053 return $this->charsets;
|
Daniel@0
|
1054 }
|
Daniel@0
|
1055 return $this->charsets = array_keys(AcceptHeader::fromString($this->headers->get('Accept-Charset'))->all());
|
Daniel@0
|
1056 }
|
Daniel@0
|
1057 public function getEncodings()
|
Daniel@0
|
1058 {
|
Daniel@0
|
1059 if (null !== $this->encodings) {
|
Daniel@0
|
1060 return $this->encodings;
|
Daniel@0
|
1061 }
|
Daniel@0
|
1062 return $this->encodings = array_keys(AcceptHeader::fromString($this->headers->get('Accept-Encoding'))->all());
|
Daniel@0
|
1063 }
|
Daniel@0
|
1064 public function getAcceptableContentTypes()
|
Daniel@0
|
1065 {
|
Daniel@0
|
1066 if (null !== $this->acceptableContentTypes) {
|
Daniel@0
|
1067 return $this->acceptableContentTypes;
|
Daniel@0
|
1068 }
|
Daniel@0
|
1069 return $this->acceptableContentTypes = array_keys(AcceptHeader::fromString($this->headers->get('Accept'))->all());
|
Daniel@0
|
1070 }
|
Daniel@0
|
1071 public function isXmlHttpRequest()
|
Daniel@0
|
1072 {
|
Daniel@0
|
1073 return'XMLHttpRequest'== $this->headers->get('X-Requested-With');
|
Daniel@0
|
1074 }
|
Daniel@0
|
1075 protected function prepareRequestUri()
|
Daniel@0
|
1076 {
|
Daniel@0
|
1077 $requestUri ='';
|
Daniel@0
|
1078 if ($this->headers->has('X_ORIGINAL_URL')) {
|
Daniel@0
|
1079 $requestUri = $this->headers->get('X_ORIGINAL_URL');
|
Daniel@0
|
1080 $this->headers->remove('X_ORIGINAL_URL');
|
Daniel@0
|
1081 $this->server->remove('HTTP_X_ORIGINAL_URL');
|
Daniel@0
|
1082 $this->server->remove('UNENCODED_URL');
|
Daniel@0
|
1083 $this->server->remove('IIS_WasUrlRewritten');
|
Daniel@0
|
1084 } elseif ($this->headers->has('X_REWRITE_URL')) {
|
Daniel@0
|
1085 $requestUri = $this->headers->get('X_REWRITE_URL');
|
Daniel@0
|
1086 $this->headers->remove('X_REWRITE_URL');
|
Daniel@0
|
1087 } elseif ($this->server->get('IIS_WasUrlRewritten') =='1'&& $this->server->get('UNENCODED_URL') !='') {
|
Daniel@0
|
1088 $requestUri = $this->server->get('UNENCODED_URL');
|
Daniel@0
|
1089 $this->server->remove('UNENCODED_URL');
|
Daniel@0
|
1090 $this->server->remove('IIS_WasUrlRewritten');
|
Daniel@0
|
1091 } elseif ($this->server->has('REQUEST_URI')) {
|
Daniel@0
|
1092 $requestUri = $this->server->get('REQUEST_URI');
|
Daniel@0
|
1093 $schemeAndHttpHost = $this->getSchemeAndHttpHost();
|
Daniel@0
|
1094 if (strpos($requestUri, $schemeAndHttpHost) === 0) {
|
Daniel@0
|
1095 $requestUri = substr($requestUri, strlen($schemeAndHttpHost));
|
Daniel@0
|
1096 }
|
Daniel@0
|
1097 } elseif ($this->server->has('ORIG_PATH_INFO')) {
|
Daniel@0
|
1098 $requestUri = $this->server->get('ORIG_PATH_INFO');
|
Daniel@0
|
1099 if (''!= $this->server->get('QUERY_STRING')) {
|
Daniel@0
|
1100 $requestUri .='?'.$this->server->get('QUERY_STRING');
|
Daniel@0
|
1101 }
|
Daniel@0
|
1102 $this->server->remove('ORIG_PATH_INFO');
|
Daniel@0
|
1103 }
|
Daniel@0
|
1104 $this->server->set('REQUEST_URI', $requestUri);
|
Daniel@0
|
1105 return $requestUri;
|
Daniel@0
|
1106 }
|
Daniel@0
|
1107 protected function prepareBaseUrl()
|
Daniel@0
|
1108 {
|
Daniel@0
|
1109 $filename = basename($this->server->get('SCRIPT_FILENAME'));
|
Daniel@0
|
1110 if (basename($this->server->get('SCRIPT_NAME')) === $filename) {
|
Daniel@0
|
1111 $baseUrl = $this->server->get('SCRIPT_NAME');
|
Daniel@0
|
1112 } elseif (basename($this->server->get('PHP_SELF')) === $filename) {
|
Daniel@0
|
1113 $baseUrl = $this->server->get('PHP_SELF');
|
Daniel@0
|
1114 } elseif (basename($this->server->get('ORIG_SCRIPT_NAME')) === $filename) {
|
Daniel@0
|
1115 $baseUrl = $this->server->get('ORIG_SCRIPT_NAME'); } else {
|
Daniel@0
|
1116 $path = $this->server->get('PHP_SELF','');
|
Daniel@0
|
1117 $file = $this->server->get('SCRIPT_FILENAME','');
|
Daniel@0
|
1118 $segs = explode('/', trim($file,'/'));
|
Daniel@0
|
1119 $segs = array_reverse($segs);
|
Daniel@0
|
1120 $index = 0;
|
Daniel@0
|
1121 $last = count($segs);
|
Daniel@0
|
1122 $baseUrl ='';
|
Daniel@0
|
1123 do {
|
Daniel@0
|
1124 $seg = $segs[$index];
|
Daniel@0
|
1125 $baseUrl ='/'.$seg.$baseUrl;
|
Daniel@0
|
1126 ++$index;
|
Daniel@0
|
1127 } while ($last > $index && (false !== $pos = strpos($path, $baseUrl)) && 0 != $pos);
|
Daniel@0
|
1128 }
|
Daniel@0
|
1129 $requestUri = $this->getRequestUri();
|
Daniel@0
|
1130 if ($baseUrl && false !== $prefix = $this->getUrlencodedPrefix($requestUri, $baseUrl)) {
|
Daniel@0
|
1131 return $prefix;
|
Daniel@0
|
1132 }
|
Daniel@0
|
1133 if ($baseUrl && false !== $prefix = $this->getUrlencodedPrefix($requestUri, dirname($baseUrl).'/')) {
|
Daniel@0
|
1134 return rtrim($prefix,'/');
|
Daniel@0
|
1135 }
|
Daniel@0
|
1136 $truncatedRequestUri = $requestUri;
|
Daniel@0
|
1137 if (false !== $pos = strpos($requestUri,'?')) {
|
Daniel@0
|
1138 $truncatedRequestUri = substr($requestUri, 0, $pos);
|
Daniel@0
|
1139 }
|
Daniel@0
|
1140 $basename = basename($baseUrl);
|
Daniel@0
|
1141 if (empty($basename) || !strpos(rawurldecode($truncatedRequestUri), $basename)) {
|
Daniel@0
|
1142 return'';
|
Daniel@0
|
1143 }
|
Daniel@0
|
1144 if (strlen($requestUri) >= strlen($baseUrl) && (false !== $pos = strpos($requestUri, $baseUrl)) && $pos !== 0) {
|
Daniel@0
|
1145 $baseUrl = substr($requestUri, 0, $pos + strlen($baseUrl));
|
Daniel@0
|
1146 }
|
Daniel@0
|
1147 return rtrim($baseUrl,'/');
|
Daniel@0
|
1148 }
|
Daniel@0
|
1149 protected function prepareBasePath()
|
Daniel@0
|
1150 {
|
Daniel@0
|
1151 $filename = basename($this->server->get('SCRIPT_FILENAME'));
|
Daniel@0
|
1152 $baseUrl = $this->getBaseUrl();
|
Daniel@0
|
1153 if (empty($baseUrl)) {
|
Daniel@0
|
1154 return'';
|
Daniel@0
|
1155 }
|
Daniel@0
|
1156 if (basename($baseUrl) === $filename) {
|
Daniel@0
|
1157 $basePath = dirname($baseUrl);
|
Daniel@0
|
1158 } else {
|
Daniel@0
|
1159 $basePath = $baseUrl;
|
Daniel@0
|
1160 }
|
Daniel@0
|
1161 if ('\\'=== DIRECTORY_SEPARATOR) {
|
Daniel@0
|
1162 $basePath = str_replace('\\','/', $basePath);
|
Daniel@0
|
1163 }
|
Daniel@0
|
1164 return rtrim($basePath,'/');
|
Daniel@0
|
1165 }
|
Daniel@0
|
1166 protected function preparePathInfo()
|
Daniel@0
|
1167 {
|
Daniel@0
|
1168 $baseUrl = $this->getBaseUrl();
|
Daniel@0
|
1169 if (null === ($requestUri = $this->getRequestUri())) {
|
Daniel@0
|
1170 return'/';
|
Daniel@0
|
1171 }
|
Daniel@0
|
1172 $pathInfo ='/';
|
Daniel@0
|
1173 if ($pos = strpos($requestUri,'?')) {
|
Daniel@0
|
1174 $requestUri = substr($requestUri, 0, $pos);
|
Daniel@0
|
1175 }
|
Daniel@0
|
1176 if (null !== $baseUrl && false === $pathInfo = substr($requestUri, strlen($baseUrl))) {
|
Daniel@0
|
1177 return'/';
|
Daniel@0
|
1178 } elseif (null === $baseUrl) {
|
Daniel@0
|
1179 return $requestUri;
|
Daniel@0
|
1180 }
|
Daniel@0
|
1181 return (string) $pathInfo;
|
Daniel@0
|
1182 }
|
Daniel@0
|
1183 protected static function initializeFormats()
|
Daniel@0
|
1184 {
|
Daniel@0
|
1185 static::$formats = array('html'=> array('text/html','application/xhtml+xml'),'txt'=> array('text/plain'),'js'=> array('application/javascript','application/x-javascript','text/javascript'),'css'=> array('text/css'),'json'=> array('application/json','application/x-json'),'xml'=> array('text/xml','application/xml','application/x-xml'),'rdf'=> array('application/rdf+xml'),'atom'=> array('application/atom+xml'),'rss'=> array('application/rss+xml'),
|
Daniel@0
|
1186 );
|
Daniel@0
|
1187 }
|
Daniel@0
|
1188 private function setPhpDefaultLocale($locale)
|
Daniel@0
|
1189 {
|
Daniel@0
|
1190 try {
|
Daniel@0
|
1191 if (class_exists('Locale', false)) {
|
Daniel@0
|
1192 \Locale::setDefault($locale);
|
Daniel@0
|
1193 }
|
Daniel@0
|
1194 } catch (\Exception $e) {
|
Daniel@0
|
1195 }
|
Daniel@0
|
1196 }
|
Daniel@0
|
1197 private function getUrlencodedPrefix($string, $prefix)
|
Daniel@0
|
1198 {
|
Daniel@0
|
1199 if (0 !== strpos(rawurldecode($string), $prefix)) {
|
Daniel@0
|
1200 return false;
|
Daniel@0
|
1201 }
|
Daniel@0
|
1202 $len = strlen($prefix);
|
Daniel@0
|
1203 if (preg_match("#^(%[[:xdigit:]]{2}|.){{$len}}#", $string, $match)) {
|
Daniel@0
|
1204 return $match[0];
|
Daniel@0
|
1205 }
|
Daniel@0
|
1206 return false;
|
Daniel@0
|
1207 }
|
Daniel@0
|
1208 private static function createRequestFromFactory(array $query = array(), array $request = array(), array $attributes = array(), array $cookies = array(), array $files = array(), array $server = array(), $content = null)
|
Daniel@0
|
1209 {
|
Daniel@0
|
1210 if (self::$requestFactory) {
|
Daniel@0
|
1211 $request = call_user_func(self::$requestFactory, $query, $request, $attributes, $cookies, $files, $server, $content);
|
Daniel@0
|
1212 if (!$request instanceof Request) {
|
Daniel@0
|
1213 throw new \LogicException('The Request factory must return an instance of Symfony\Component\HttpFoundation\Request.');
|
Daniel@0
|
1214 }
|
Daniel@0
|
1215 return $request;
|
Daniel@0
|
1216 }
|
Daniel@0
|
1217 return new static($query, $request, $attributes, $cookies, $files, $server, $content);
|
Daniel@0
|
1218 }
|
Daniel@0
|
1219 }
|
Daniel@0
|
1220 }
|
Daniel@0
|
1221 namespace Symfony\Component\HttpFoundation
|
Daniel@0
|
1222 {
|
Daniel@0
|
1223 class Response
|
Daniel@0
|
1224 {
|
Daniel@0
|
1225 const HTTP_CONTINUE = 100;
|
Daniel@0
|
1226 const HTTP_SWITCHING_PROTOCOLS = 101;
|
Daniel@0
|
1227 const HTTP_PROCESSING = 102; const HTTP_OK = 200;
|
Daniel@0
|
1228 const HTTP_CREATED = 201;
|
Daniel@0
|
1229 const HTTP_ACCEPTED = 202;
|
Daniel@0
|
1230 const HTTP_NON_AUTHORITATIVE_INFORMATION = 203;
|
Daniel@0
|
1231 const HTTP_NO_CONTENT = 204;
|
Daniel@0
|
1232 const HTTP_RESET_CONTENT = 205;
|
Daniel@0
|
1233 const HTTP_PARTIAL_CONTENT = 206;
|
Daniel@0
|
1234 const HTTP_MULTI_STATUS = 207; const HTTP_ALREADY_REPORTED = 208; const HTTP_IM_USED = 226; const HTTP_MULTIPLE_CHOICES = 300;
|
Daniel@0
|
1235 const HTTP_MOVED_PERMANENTLY = 301;
|
Daniel@0
|
1236 const HTTP_FOUND = 302;
|
Daniel@0
|
1237 const HTTP_SEE_OTHER = 303;
|
Daniel@0
|
1238 const HTTP_NOT_MODIFIED = 304;
|
Daniel@0
|
1239 const HTTP_USE_PROXY = 305;
|
Daniel@0
|
1240 const HTTP_RESERVED = 306;
|
Daniel@0
|
1241 const HTTP_TEMPORARY_REDIRECT = 307;
|
Daniel@0
|
1242 const HTTP_PERMANENTLY_REDIRECT = 308; const HTTP_BAD_REQUEST = 400;
|
Daniel@0
|
1243 const HTTP_UNAUTHORIZED = 401;
|
Daniel@0
|
1244 const HTTP_PAYMENT_REQUIRED = 402;
|
Daniel@0
|
1245 const HTTP_FORBIDDEN = 403;
|
Daniel@0
|
1246 const HTTP_NOT_FOUND = 404;
|
Daniel@0
|
1247 const HTTP_METHOD_NOT_ALLOWED = 405;
|
Daniel@0
|
1248 const HTTP_NOT_ACCEPTABLE = 406;
|
Daniel@0
|
1249 const HTTP_PROXY_AUTHENTICATION_REQUIRED = 407;
|
Daniel@0
|
1250 const HTTP_REQUEST_TIMEOUT = 408;
|
Daniel@0
|
1251 const HTTP_CONFLICT = 409;
|
Daniel@0
|
1252 const HTTP_GONE = 410;
|
Daniel@0
|
1253 const HTTP_LENGTH_REQUIRED = 411;
|
Daniel@0
|
1254 const HTTP_PRECONDITION_FAILED = 412;
|
Daniel@0
|
1255 const HTTP_REQUEST_ENTITY_TOO_LARGE = 413;
|
Daniel@0
|
1256 const HTTP_REQUEST_URI_TOO_LONG = 414;
|
Daniel@0
|
1257 const HTTP_UNSUPPORTED_MEDIA_TYPE = 415;
|
Daniel@0
|
1258 const HTTP_REQUESTED_RANGE_NOT_SATISFIABLE = 416;
|
Daniel@0
|
1259 const HTTP_EXPECTATION_FAILED = 417;
|
Daniel@0
|
1260 const HTTP_I_AM_A_TEAPOT = 418; const HTTP_UNPROCESSABLE_ENTITY = 422; const HTTP_LOCKED = 423; const HTTP_FAILED_DEPENDENCY = 424; const HTTP_RESERVED_FOR_WEBDAV_ADVANCED_COLLECTIONS_EXPIRED_PROPOSAL = 425; const HTTP_UPGRADE_REQUIRED = 426; const HTTP_PRECONDITION_REQUIRED = 428; const HTTP_TOO_MANY_REQUESTS = 429; const HTTP_REQUEST_HEADER_FIELDS_TOO_LARGE = 431; const HTTP_INTERNAL_SERVER_ERROR = 500;
|
Daniel@0
|
1261 const HTTP_NOT_IMPLEMENTED = 501;
|
Daniel@0
|
1262 const HTTP_BAD_GATEWAY = 502;
|
Daniel@0
|
1263 const HTTP_SERVICE_UNAVAILABLE = 503;
|
Daniel@0
|
1264 const HTTP_GATEWAY_TIMEOUT = 504;
|
Daniel@0
|
1265 const HTTP_VERSION_NOT_SUPPORTED = 505;
|
Daniel@0
|
1266 const HTTP_VARIANT_ALSO_NEGOTIATES_EXPERIMENTAL = 506; const HTTP_INSUFFICIENT_STORAGE = 507; const HTTP_LOOP_DETECTED = 508; const HTTP_NOT_EXTENDED = 510; const HTTP_NETWORK_AUTHENTICATION_REQUIRED = 511;
|
Daniel@0
|
1267 public $headers;
|
Daniel@0
|
1268 protected $content;
|
Daniel@0
|
1269 protected $version;
|
Daniel@0
|
1270 protected $statusCode;
|
Daniel@0
|
1271 protected $statusText;
|
Daniel@0
|
1272 protected $charset;
|
Daniel@0
|
1273 public static $statusTexts = array(
|
Daniel@0
|
1274 100 =>'Continue',
|
Daniel@0
|
1275 101 =>'Switching Protocols',
|
Daniel@0
|
1276 102 =>'Processing', 200 =>'OK',
|
Daniel@0
|
1277 201 =>'Created',
|
Daniel@0
|
1278 202 =>'Accepted',
|
Daniel@0
|
1279 203 =>'Non-Authoritative Information',
|
Daniel@0
|
1280 204 =>'No Content',
|
Daniel@0
|
1281 205 =>'Reset Content',
|
Daniel@0
|
1282 206 =>'Partial Content',
|
Daniel@0
|
1283 207 =>'Multi-Status', 208 =>'Already Reported', 226 =>'IM Used', 300 =>'Multiple Choices',
|
Daniel@0
|
1284 301 =>'Moved Permanently',
|
Daniel@0
|
1285 302 =>'Found',
|
Daniel@0
|
1286 303 =>'See Other',
|
Daniel@0
|
1287 304 =>'Not Modified',
|
Daniel@0
|
1288 305 =>'Use Proxy',
|
Daniel@0
|
1289 306 =>'Reserved',
|
Daniel@0
|
1290 307 =>'Temporary Redirect',
|
Daniel@0
|
1291 308 =>'Permanent Redirect', 400 =>'Bad Request',
|
Daniel@0
|
1292 401 =>'Unauthorized',
|
Daniel@0
|
1293 402 =>'Payment Required',
|
Daniel@0
|
1294 403 =>'Forbidden',
|
Daniel@0
|
1295 404 =>'Not Found',
|
Daniel@0
|
1296 405 =>'Method Not Allowed',
|
Daniel@0
|
1297 406 =>'Not Acceptable',
|
Daniel@0
|
1298 407 =>'Proxy Authentication Required',
|
Daniel@0
|
1299 408 =>'Request Timeout',
|
Daniel@0
|
1300 409 =>'Conflict',
|
Daniel@0
|
1301 410 =>'Gone',
|
Daniel@0
|
1302 411 =>'Length Required',
|
Daniel@0
|
1303 412 =>'Precondition Failed',
|
Daniel@0
|
1304 413 =>'Request Entity Too Large',
|
Daniel@0
|
1305 414 =>'Request-URI Too Long',
|
Daniel@0
|
1306 415 =>'Unsupported Media Type',
|
Daniel@0
|
1307 416 =>'Requested Range Not Satisfiable',
|
Daniel@0
|
1308 417 =>'Expectation Failed',
|
Daniel@0
|
1309 418 =>'I\'m a teapot', 422 =>'Unprocessable Entity', 423 =>'Locked', 424 =>'Failed Dependency', 425 =>'Reserved for WebDAV advanced collections expired proposal', 426 =>'Upgrade Required', 428 =>'Precondition Required', 429 =>'Too Many Requests', 431 =>'Request Header Fields Too Large', 500 =>'Internal Server Error',
|
Daniel@0
|
1310 501 =>'Not Implemented',
|
Daniel@0
|
1311 502 =>'Bad Gateway',
|
Daniel@0
|
1312 503 =>'Service Unavailable',
|
Daniel@0
|
1313 504 =>'Gateway Timeout',
|
Daniel@0
|
1314 505 =>'HTTP Version Not Supported',
|
Daniel@0
|
1315 506 =>'Variant Also Negotiates (Experimental)', 507 =>'Insufficient Storage', 508 =>'Loop Detected', 510 =>'Not Extended', 511 =>'Network Authentication Required', );
|
Daniel@0
|
1316 public function __construct($content ='', $status = 200, $headers = array())
|
Daniel@0
|
1317 {
|
Daniel@0
|
1318 $this->headers = new ResponseHeaderBag($headers);
|
Daniel@0
|
1319 $this->setContent($content);
|
Daniel@0
|
1320 $this->setStatusCode($status);
|
Daniel@0
|
1321 $this->setProtocolVersion('1.0');
|
Daniel@0
|
1322 if (!$this->headers->has('Date')) {
|
Daniel@0
|
1323 $this->setDate(new \DateTime(null, new \DateTimeZone('UTC')));
|
Daniel@0
|
1324 }
|
Daniel@0
|
1325 }
|
Daniel@0
|
1326 public static function create($content ='', $status = 200, $headers = array())
|
Daniel@0
|
1327 {
|
Daniel@0
|
1328 return new static($content, $status, $headers);
|
Daniel@0
|
1329 }
|
Daniel@0
|
1330 public function __toString()
|
Daniel@0
|
1331 {
|
Daniel@0
|
1332 return
|
Daniel@0
|
1333 sprintf('HTTP/%s %s %s', $this->version, $this->statusCode, $this->statusText)."\r\n".
|
Daniel@0
|
1334 $this->headers."\r\n".
|
Daniel@0
|
1335 $this->getContent();
|
Daniel@0
|
1336 }
|
Daniel@0
|
1337 public function __clone()
|
Daniel@0
|
1338 {
|
Daniel@0
|
1339 $this->headers = clone $this->headers;
|
Daniel@0
|
1340 }
|
Daniel@0
|
1341 public function prepare(Request $request)
|
Daniel@0
|
1342 {
|
Daniel@0
|
1343 $headers = $this->headers;
|
Daniel@0
|
1344 if ($this->isInformational() || $this->isEmpty()) {
|
Daniel@0
|
1345 $this->setContent(null);
|
Daniel@0
|
1346 $headers->remove('Content-Type');
|
Daniel@0
|
1347 $headers->remove('Content-Length');
|
Daniel@0
|
1348 } else {
|
Daniel@0
|
1349 if (!$headers->has('Content-Type')) {
|
Daniel@0
|
1350 $format = $request->getRequestFormat();
|
Daniel@0
|
1351 if (null !== $format && $mimeType = $request->getMimeType($format)) {
|
Daniel@0
|
1352 $headers->set('Content-Type', $mimeType);
|
Daniel@0
|
1353 }
|
Daniel@0
|
1354 }
|
Daniel@0
|
1355 $charset = $this->charset ?:'UTF-8';
|
Daniel@0
|
1356 if (!$headers->has('Content-Type')) {
|
Daniel@0
|
1357 $headers->set('Content-Type','text/html; charset='.$charset);
|
Daniel@0
|
1358 } elseif (0 === stripos($headers->get('Content-Type'),'text/') && false === stripos($headers->get('Content-Type'),'charset')) {
|
Daniel@0
|
1359 $headers->set('Content-Type', $headers->get('Content-Type').'; charset='.$charset);
|
Daniel@0
|
1360 }
|
Daniel@0
|
1361 if ($headers->has('Transfer-Encoding')) {
|
Daniel@0
|
1362 $headers->remove('Content-Length');
|
Daniel@0
|
1363 }
|
Daniel@0
|
1364 if ($request->isMethod('HEAD')) {
|
Daniel@0
|
1365 $length = $headers->get('Content-Length');
|
Daniel@0
|
1366 $this->setContent(null);
|
Daniel@0
|
1367 if ($length) {
|
Daniel@0
|
1368 $headers->set('Content-Length', $length);
|
Daniel@0
|
1369 }
|
Daniel@0
|
1370 }
|
Daniel@0
|
1371 }
|
Daniel@0
|
1372 if ('HTTP/1.0'!= $request->server->get('SERVER_PROTOCOL')) {
|
Daniel@0
|
1373 $this->setProtocolVersion('1.1');
|
Daniel@0
|
1374 }
|
Daniel@0
|
1375 if ('1.0'== $this->getProtocolVersion() &&'no-cache'== $this->headers->get('Cache-Control')) {
|
Daniel@0
|
1376 $this->headers->set('pragma','no-cache');
|
Daniel@0
|
1377 $this->headers->set('expires', -1);
|
Daniel@0
|
1378 }
|
Daniel@0
|
1379 $this->ensureIEOverSSLCompatibility($request);
|
Daniel@0
|
1380 return $this;
|
Daniel@0
|
1381 }
|
Daniel@0
|
1382 public function sendHeaders()
|
Daniel@0
|
1383 {
|
Daniel@0
|
1384 if (headers_sent()) {
|
Daniel@0
|
1385 return $this;
|
Daniel@0
|
1386 }
|
Daniel@0
|
1387 header(sprintf('HTTP/%s %s %s', $this->version, $this->statusCode, $this->statusText), true, $this->statusCode);
|
Daniel@0
|
1388 foreach ($this->headers->allPreserveCase() as $name => $values) {
|
Daniel@0
|
1389 foreach ($values as $value) {
|
Daniel@0
|
1390 header($name.': '.$value, false, $this->statusCode);
|
Daniel@0
|
1391 }
|
Daniel@0
|
1392 }
|
Daniel@0
|
1393 foreach ($this->headers->getCookies() as $cookie) {
|
Daniel@0
|
1394 setcookie($cookie->getName(), $cookie->getValue(), $cookie->getExpiresTime(), $cookie->getPath(), $cookie->getDomain(), $cookie->isSecure(), $cookie->isHttpOnly());
|
Daniel@0
|
1395 }
|
Daniel@0
|
1396 return $this;
|
Daniel@0
|
1397 }
|
Daniel@0
|
1398 public function sendContent()
|
Daniel@0
|
1399 {
|
Daniel@0
|
1400 echo $this->content;
|
Daniel@0
|
1401 return $this;
|
Daniel@0
|
1402 }
|
Daniel@0
|
1403 public function send()
|
Daniel@0
|
1404 {
|
Daniel@0
|
1405 $this->sendHeaders();
|
Daniel@0
|
1406 $this->sendContent();
|
Daniel@0
|
1407 if (function_exists('fastcgi_finish_request')) {
|
Daniel@0
|
1408 fastcgi_finish_request();
|
Daniel@0
|
1409 } elseif ('cli'!== PHP_SAPI) {
|
Daniel@0
|
1410 static::closeOutputBuffers(0, true);
|
Daniel@0
|
1411 }
|
Daniel@0
|
1412 return $this;
|
Daniel@0
|
1413 }
|
Daniel@0
|
1414 public function setContent($content)
|
Daniel@0
|
1415 {
|
Daniel@0
|
1416 if (null !== $content && !is_string($content) && !is_numeric($content) && !is_callable(array($content,'__toString'))) {
|
Daniel@0
|
1417 throw new \UnexpectedValueException(sprintf('The Response content must be a string or object implementing __toString(), "%s" given.', gettype($content)));
|
Daniel@0
|
1418 }
|
Daniel@0
|
1419 $this->content = (string) $content;
|
Daniel@0
|
1420 return $this;
|
Daniel@0
|
1421 }
|
Daniel@0
|
1422 public function getContent()
|
Daniel@0
|
1423 {
|
Daniel@0
|
1424 return $this->content;
|
Daniel@0
|
1425 }
|
Daniel@0
|
1426 public function setProtocolVersion($version)
|
Daniel@0
|
1427 {
|
Daniel@0
|
1428 $this->version = $version;
|
Daniel@0
|
1429 return $this;
|
Daniel@0
|
1430 }
|
Daniel@0
|
1431 public function getProtocolVersion()
|
Daniel@0
|
1432 {
|
Daniel@0
|
1433 return $this->version;
|
Daniel@0
|
1434 }
|
Daniel@0
|
1435 public function setStatusCode($code, $text = null)
|
Daniel@0
|
1436 {
|
Daniel@0
|
1437 $this->statusCode = $code = (int) $code;
|
Daniel@0
|
1438 if ($this->isInvalid()) {
|
Daniel@0
|
1439 throw new \InvalidArgumentException(sprintf('The HTTP status code "%s" is not valid.', $code));
|
Daniel@0
|
1440 }
|
Daniel@0
|
1441 if (null === $text) {
|
Daniel@0
|
1442 $this->statusText = isset(self::$statusTexts[$code]) ? self::$statusTexts[$code] :'';
|
Daniel@0
|
1443 return $this;
|
Daniel@0
|
1444 }
|
Daniel@0
|
1445 if (false === $text) {
|
Daniel@0
|
1446 $this->statusText ='';
|
Daniel@0
|
1447 return $this;
|
Daniel@0
|
1448 }
|
Daniel@0
|
1449 $this->statusText = $text;
|
Daniel@0
|
1450 return $this;
|
Daniel@0
|
1451 }
|
Daniel@0
|
1452 public function getStatusCode()
|
Daniel@0
|
1453 {
|
Daniel@0
|
1454 return $this->statusCode;
|
Daniel@0
|
1455 }
|
Daniel@0
|
1456 public function setCharset($charset)
|
Daniel@0
|
1457 {
|
Daniel@0
|
1458 $this->charset = $charset;
|
Daniel@0
|
1459 return $this;
|
Daniel@0
|
1460 }
|
Daniel@0
|
1461 public function getCharset()
|
Daniel@0
|
1462 {
|
Daniel@0
|
1463 return $this->charset;
|
Daniel@0
|
1464 }
|
Daniel@0
|
1465 public function isCacheable()
|
Daniel@0
|
1466 {
|
Daniel@0
|
1467 if (!in_array($this->statusCode, array(200, 203, 300, 301, 302, 404, 410))) {
|
Daniel@0
|
1468 return false;
|
Daniel@0
|
1469 }
|
Daniel@0
|
1470 if ($this->headers->hasCacheControlDirective('no-store') || $this->headers->getCacheControlDirective('private')) {
|
Daniel@0
|
1471 return false;
|
Daniel@0
|
1472 }
|
Daniel@0
|
1473 return $this->isValidateable() || $this->isFresh();
|
Daniel@0
|
1474 }
|
Daniel@0
|
1475 public function isFresh()
|
Daniel@0
|
1476 {
|
Daniel@0
|
1477 return $this->getTtl() > 0;
|
Daniel@0
|
1478 }
|
Daniel@0
|
1479 public function isValidateable()
|
Daniel@0
|
1480 {
|
Daniel@0
|
1481 return $this->headers->has('Last-Modified') || $this->headers->has('ETag');
|
Daniel@0
|
1482 }
|
Daniel@0
|
1483 public function setPrivate()
|
Daniel@0
|
1484 {
|
Daniel@0
|
1485 $this->headers->removeCacheControlDirective('public');
|
Daniel@0
|
1486 $this->headers->addCacheControlDirective('private');
|
Daniel@0
|
1487 return $this;
|
Daniel@0
|
1488 }
|
Daniel@0
|
1489 public function setPublic()
|
Daniel@0
|
1490 {
|
Daniel@0
|
1491 $this->headers->addCacheControlDirective('public');
|
Daniel@0
|
1492 $this->headers->removeCacheControlDirective('private');
|
Daniel@0
|
1493 return $this;
|
Daniel@0
|
1494 }
|
Daniel@0
|
1495 public function mustRevalidate()
|
Daniel@0
|
1496 {
|
Daniel@0
|
1497 return $this->headers->hasCacheControlDirective('must-revalidate') || $this->headers->has('proxy-revalidate');
|
Daniel@0
|
1498 }
|
Daniel@0
|
1499 public function getDate()
|
Daniel@0
|
1500 {
|
Daniel@0
|
1501 return $this->headers->getDate('Date', new \DateTime());
|
Daniel@0
|
1502 }
|
Daniel@0
|
1503 public function setDate(\DateTime $date)
|
Daniel@0
|
1504 {
|
Daniel@0
|
1505 $date->setTimezone(new \DateTimeZone('UTC'));
|
Daniel@0
|
1506 $this->headers->set('Date', $date->format('D, d M Y H:i:s').' GMT');
|
Daniel@0
|
1507 return $this;
|
Daniel@0
|
1508 }
|
Daniel@0
|
1509 public function getAge()
|
Daniel@0
|
1510 {
|
Daniel@0
|
1511 if (null !== $age = $this->headers->get('Age')) {
|
Daniel@0
|
1512 return (int) $age;
|
Daniel@0
|
1513 }
|
Daniel@0
|
1514 return max(time() - $this->getDate()->format('U'), 0);
|
Daniel@0
|
1515 }
|
Daniel@0
|
1516 public function expire()
|
Daniel@0
|
1517 {
|
Daniel@0
|
1518 if ($this->isFresh()) {
|
Daniel@0
|
1519 $this->headers->set('Age', $this->getMaxAge());
|
Daniel@0
|
1520 }
|
Daniel@0
|
1521 return $this;
|
Daniel@0
|
1522 }
|
Daniel@0
|
1523 public function getExpires()
|
Daniel@0
|
1524 {
|
Daniel@0
|
1525 try {
|
Daniel@0
|
1526 return $this->headers->getDate('Expires');
|
Daniel@0
|
1527 } catch (\RuntimeException $e) {
|
Daniel@0
|
1528 return \DateTime::createFromFormat(DATE_RFC2822,'Sat, 01 Jan 00 00:00:00 +0000');
|
Daniel@0
|
1529 }
|
Daniel@0
|
1530 }
|
Daniel@0
|
1531 public function setExpires(\DateTime $date = null)
|
Daniel@0
|
1532 {
|
Daniel@0
|
1533 if (null === $date) {
|
Daniel@0
|
1534 $this->headers->remove('Expires');
|
Daniel@0
|
1535 } else {
|
Daniel@0
|
1536 $date = clone $date;
|
Daniel@0
|
1537 $date->setTimezone(new \DateTimeZone('UTC'));
|
Daniel@0
|
1538 $this->headers->set('Expires', $date->format('D, d M Y H:i:s').' GMT');
|
Daniel@0
|
1539 }
|
Daniel@0
|
1540 return $this;
|
Daniel@0
|
1541 }
|
Daniel@0
|
1542 public function getMaxAge()
|
Daniel@0
|
1543 {
|
Daniel@0
|
1544 if ($this->headers->hasCacheControlDirective('s-maxage')) {
|
Daniel@0
|
1545 return (int) $this->headers->getCacheControlDirective('s-maxage');
|
Daniel@0
|
1546 }
|
Daniel@0
|
1547 if ($this->headers->hasCacheControlDirective('max-age')) {
|
Daniel@0
|
1548 return (int) $this->headers->getCacheControlDirective('max-age');
|
Daniel@0
|
1549 }
|
Daniel@0
|
1550 if (null !== $this->getExpires()) {
|
Daniel@0
|
1551 return $this->getExpires()->format('U') - $this->getDate()->format('U');
|
Daniel@0
|
1552 }
|
Daniel@0
|
1553 }
|
Daniel@0
|
1554 public function setMaxAge($value)
|
Daniel@0
|
1555 {
|
Daniel@0
|
1556 $this->headers->addCacheControlDirective('max-age', $value);
|
Daniel@0
|
1557 return $this;
|
Daniel@0
|
1558 }
|
Daniel@0
|
1559 public function setSharedMaxAge($value)
|
Daniel@0
|
1560 {
|
Daniel@0
|
1561 $this->setPublic();
|
Daniel@0
|
1562 $this->headers->addCacheControlDirective('s-maxage', $value);
|
Daniel@0
|
1563 return $this;
|
Daniel@0
|
1564 }
|
Daniel@0
|
1565 public function getTtl()
|
Daniel@0
|
1566 {
|
Daniel@0
|
1567 if (null !== $maxAge = $this->getMaxAge()) {
|
Daniel@0
|
1568 return $maxAge - $this->getAge();
|
Daniel@0
|
1569 }
|
Daniel@0
|
1570 }
|
Daniel@0
|
1571 public function setTtl($seconds)
|
Daniel@0
|
1572 {
|
Daniel@0
|
1573 $this->setSharedMaxAge($this->getAge() + $seconds);
|
Daniel@0
|
1574 return $this;
|
Daniel@0
|
1575 }
|
Daniel@0
|
1576 public function setClientTtl($seconds)
|
Daniel@0
|
1577 {
|
Daniel@0
|
1578 $this->setMaxAge($this->getAge() + $seconds);
|
Daniel@0
|
1579 return $this;
|
Daniel@0
|
1580 }
|
Daniel@0
|
1581 public function getLastModified()
|
Daniel@0
|
1582 {
|
Daniel@0
|
1583 return $this->headers->getDate('Last-Modified');
|
Daniel@0
|
1584 }
|
Daniel@0
|
1585 public function setLastModified(\DateTime $date = null)
|
Daniel@0
|
1586 {
|
Daniel@0
|
1587 if (null === $date) {
|
Daniel@0
|
1588 $this->headers->remove('Last-Modified');
|
Daniel@0
|
1589 } else {
|
Daniel@0
|
1590 $date = clone $date;
|
Daniel@0
|
1591 $date->setTimezone(new \DateTimeZone('UTC'));
|
Daniel@0
|
1592 $this->headers->set('Last-Modified', $date->format('D, d M Y H:i:s').' GMT');
|
Daniel@0
|
1593 }
|
Daniel@0
|
1594 return $this;
|
Daniel@0
|
1595 }
|
Daniel@0
|
1596 public function getEtag()
|
Daniel@0
|
1597 {
|
Daniel@0
|
1598 return $this->headers->get('ETag');
|
Daniel@0
|
1599 }
|
Daniel@0
|
1600 public function setEtag($etag = null, $weak = false)
|
Daniel@0
|
1601 {
|
Daniel@0
|
1602 if (null === $etag) {
|
Daniel@0
|
1603 $this->headers->remove('Etag');
|
Daniel@0
|
1604 } else {
|
Daniel@0
|
1605 if (0 !== strpos($etag,'"')) {
|
Daniel@0
|
1606 $etag ='"'.$etag.'"';
|
Daniel@0
|
1607 }
|
Daniel@0
|
1608 $this->headers->set('ETag', (true === $weak ?'W/':'').$etag);
|
Daniel@0
|
1609 }
|
Daniel@0
|
1610 return $this;
|
Daniel@0
|
1611 }
|
Daniel@0
|
1612 public function setCache(array $options)
|
Daniel@0
|
1613 {
|
Daniel@0
|
1614 if ($diff = array_diff(array_keys($options), array('etag','last_modified','max_age','s_maxage','private','public'))) {
|
Daniel@0
|
1615 throw new \InvalidArgumentException(sprintf('Response does not support the following options: "%s".', implode('", "', array_values($diff))));
|
Daniel@0
|
1616 }
|
Daniel@0
|
1617 if (isset($options['etag'])) {
|
Daniel@0
|
1618 $this->setEtag($options['etag']);
|
Daniel@0
|
1619 }
|
Daniel@0
|
1620 if (isset($options['last_modified'])) {
|
Daniel@0
|
1621 $this->setLastModified($options['last_modified']);
|
Daniel@0
|
1622 }
|
Daniel@0
|
1623 if (isset($options['max_age'])) {
|
Daniel@0
|
1624 $this->setMaxAge($options['max_age']);
|
Daniel@0
|
1625 }
|
Daniel@0
|
1626 if (isset($options['s_maxage'])) {
|
Daniel@0
|
1627 $this->setSharedMaxAge($options['s_maxage']);
|
Daniel@0
|
1628 }
|
Daniel@0
|
1629 if (isset($options['public'])) {
|
Daniel@0
|
1630 if ($options['public']) {
|
Daniel@0
|
1631 $this->setPublic();
|
Daniel@0
|
1632 } else {
|
Daniel@0
|
1633 $this->setPrivate();
|
Daniel@0
|
1634 }
|
Daniel@0
|
1635 }
|
Daniel@0
|
1636 if (isset($options['private'])) {
|
Daniel@0
|
1637 if ($options['private']) {
|
Daniel@0
|
1638 $this->setPrivate();
|
Daniel@0
|
1639 } else {
|
Daniel@0
|
1640 $this->setPublic();
|
Daniel@0
|
1641 }
|
Daniel@0
|
1642 }
|
Daniel@0
|
1643 return $this;
|
Daniel@0
|
1644 }
|
Daniel@0
|
1645 public function setNotModified()
|
Daniel@0
|
1646 {
|
Daniel@0
|
1647 $this->setStatusCode(304);
|
Daniel@0
|
1648 $this->setContent(null);
|
Daniel@0
|
1649 foreach (array('Allow','Content-Encoding','Content-Language','Content-Length','Content-MD5','Content-Type','Last-Modified') as $header) {
|
Daniel@0
|
1650 $this->headers->remove($header);
|
Daniel@0
|
1651 }
|
Daniel@0
|
1652 return $this;
|
Daniel@0
|
1653 }
|
Daniel@0
|
1654 public function hasVary()
|
Daniel@0
|
1655 {
|
Daniel@0
|
1656 return null !== $this->headers->get('Vary');
|
Daniel@0
|
1657 }
|
Daniel@0
|
1658 public function getVary()
|
Daniel@0
|
1659 {
|
Daniel@0
|
1660 if (!$vary = $this->headers->get('Vary', null, false)) {
|
Daniel@0
|
1661 return array();
|
Daniel@0
|
1662 }
|
Daniel@0
|
1663 $ret = array();
|
Daniel@0
|
1664 foreach ($vary as $item) {
|
Daniel@0
|
1665 $ret = array_merge($ret, preg_split('/[\s,]+/', $item));
|
Daniel@0
|
1666 }
|
Daniel@0
|
1667 return $ret;
|
Daniel@0
|
1668 }
|
Daniel@0
|
1669 public function setVary($headers, $replace = true)
|
Daniel@0
|
1670 {
|
Daniel@0
|
1671 $this->headers->set('Vary', $headers, $replace);
|
Daniel@0
|
1672 return $this;
|
Daniel@0
|
1673 }
|
Daniel@0
|
1674 public function isNotModified(Request $request)
|
Daniel@0
|
1675 {
|
Daniel@0
|
1676 if (!$request->isMethodSafe()) {
|
Daniel@0
|
1677 return false;
|
Daniel@0
|
1678 }
|
Daniel@0
|
1679 $notModified = false;
|
Daniel@0
|
1680 $lastModified = $this->headers->get('Last-Modified');
|
Daniel@0
|
1681 $modifiedSince = $request->headers->get('If-Modified-Since');
|
Daniel@0
|
1682 if ($etags = $request->getEtags()) {
|
Daniel@0
|
1683 $notModified = in_array($this->getEtag(), $etags) || in_array('*', $etags);
|
Daniel@0
|
1684 }
|
Daniel@0
|
1685 if ($modifiedSince && $lastModified) {
|
Daniel@0
|
1686 $notModified = strtotime($modifiedSince) >= strtotime($lastModified) && (!$etags || $notModified);
|
Daniel@0
|
1687 }
|
Daniel@0
|
1688 if ($notModified) {
|
Daniel@0
|
1689 $this->setNotModified();
|
Daniel@0
|
1690 }
|
Daniel@0
|
1691 return $notModified;
|
Daniel@0
|
1692 }
|
Daniel@0
|
1693 public function isInvalid()
|
Daniel@0
|
1694 {
|
Daniel@0
|
1695 return $this->statusCode < 100 || $this->statusCode >= 600;
|
Daniel@0
|
1696 }
|
Daniel@0
|
1697 public function isInformational()
|
Daniel@0
|
1698 {
|
Daniel@0
|
1699 return $this->statusCode >= 100 && $this->statusCode < 200;
|
Daniel@0
|
1700 }
|
Daniel@0
|
1701 public function isSuccessful()
|
Daniel@0
|
1702 {
|
Daniel@0
|
1703 return $this->statusCode >= 200 && $this->statusCode < 300;
|
Daniel@0
|
1704 }
|
Daniel@0
|
1705 public function isRedirection()
|
Daniel@0
|
1706 {
|
Daniel@0
|
1707 return $this->statusCode >= 300 && $this->statusCode < 400;
|
Daniel@0
|
1708 }
|
Daniel@0
|
1709 public function isClientError()
|
Daniel@0
|
1710 {
|
Daniel@0
|
1711 return $this->statusCode >= 400 && $this->statusCode < 500;
|
Daniel@0
|
1712 }
|
Daniel@0
|
1713 public function isServerError()
|
Daniel@0
|
1714 {
|
Daniel@0
|
1715 return $this->statusCode >= 500 && $this->statusCode < 600;
|
Daniel@0
|
1716 }
|
Daniel@0
|
1717 public function isOk()
|
Daniel@0
|
1718 {
|
Daniel@0
|
1719 return 200 === $this->statusCode;
|
Daniel@0
|
1720 }
|
Daniel@0
|
1721 public function isForbidden()
|
Daniel@0
|
1722 {
|
Daniel@0
|
1723 return 403 === $this->statusCode;
|
Daniel@0
|
1724 }
|
Daniel@0
|
1725 public function isNotFound()
|
Daniel@0
|
1726 {
|
Daniel@0
|
1727 return 404 === $this->statusCode;
|
Daniel@0
|
1728 }
|
Daniel@0
|
1729 public function isRedirect($location = null)
|
Daniel@0
|
1730 {
|
Daniel@0
|
1731 return in_array($this->statusCode, array(201, 301, 302, 303, 307, 308)) && (null === $location ?: $location == $this->headers->get('Location'));
|
Daniel@0
|
1732 }
|
Daniel@0
|
1733 public function isEmpty()
|
Daniel@0
|
1734 {
|
Daniel@0
|
1735 return in_array($this->statusCode, array(204, 304));
|
Daniel@0
|
1736 }
|
Daniel@0
|
1737 public static function closeOutputBuffers($targetLevel, $flush)
|
Daniel@0
|
1738 {
|
Daniel@0
|
1739 $status = ob_get_status(true);
|
Daniel@0
|
1740 $level = count($status);
|
Daniel@0
|
1741 while ($level-- > $targetLevel
|
Daniel@0
|
1742 && (!empty($status[$level]['del'])
|
Daniel@0
|
1743 || (isset($status[$level]['flags'])
|
Daniel@0
|
1744 && ($status[$level]['flags'] & PHP_OUTPUT_HANDLER_REMOVABLE)
|
Daniel@0
|
1745 && ($status[$level]['flags'] & ($flush ? PHP_OUTPUT_HANDLER_FLUSHABLE : PHP_OUTPUT_HANDLER_CLEANABLE))
|
Daniel@0
|
1746 )
|
Daniel@0
|
1747 )
|
Daniel@0
|
1748 ) {
|
Daniel@0
|
1749 if ($flush) {
|
Daniel@0
|
1750 ob_end_flush();
|
Daniel@0
|
1751 } else {
|
Daniel@0
|
1752 ob_end_clean();
|
Daniel@0
|
1753 }
|
Daniel@0
|
1754 }
|
Daniel@0
|
1755 }
|
Daniel@0
|
1756 protected function ensureIEOverSSLCompatibility(Request $request)
|
Daniel@0
|
1757 {
|
Daniel@0
|
1758 if (false !== stripos($this->headers->get('Content-Disposition'),'attachment') && preg_match('/MSIE (.*?);/i', $request->server->get('HTTP_USER_AGENT'), $match) == 1 && true === $request->isSecure()) {
|
Daniel@0
|
1759 if (intval(preg_replace("/(MSIE )(.*?);/","$2", $match[0])) < 9) {
|
Daniel@0
|
1760 $this->headers->remove('Cache-Control');
|
Daniel@0
|
1761 }
|
Daniel@0
|
1762 }
|
Daniel@0
|
1763 }
|
Daniel@0
|
1764 }
|
Daniel@0
|
1765 }
|
Daniel@0
|
1766 namespace Symfony\Component\HttpFoundation
|
Daniel@0
|
1767 {
|
Daniel@0
|
1768 class ResponseHeaderBag extends HeaderBag
|
Daniel@0
|
1769 {
|
Daniel@0
|
1770 const COOKIES_FLAT ='flat';
|
Daniel@0
|
1771 const COOKIES_ARRAY ='array';
|
Daniel@0
|
1772 const DISPOSITION_ATTACHMENT ='attachment';
|
Daniel@0
|
1773 const DISPOSITION_INLINE ='inline';
|
Daniel@0
|
1774 protected $computedCacheControl = array();
|
Daniel@0
|
1775 protected $cookies = array();
|
Daniel@0
|
1776 protected $headerNames = array();
|
Daniel@0
|
1777 public function __construct(array $headers = array())
|
Daniel@0
|
1778 {
|
Daniel@0
|
1779 parent::__construct($headers);
|
Daniel@0
|
1780 if (!isset($this->headers['cache-control'])) {
|
Daniel@0
|
1781 $this->set('Cache-Control','');
|
Daniel@0
|
1782 }
|
Daniel@0
|
1783 }
|
Daniel@0
|
1784 public function __toString()
|
Daniel@0
|
1785 {
|
Daniel@0
|
1786 $cookies ='';
|
Daniel@0
|
1787 foreach ($this->getCookies() as $cookie) {
|
Daniel@0
|
1788 $cookies .='Set-Cookie: '.$cookie."\r\n";
|
Daniel@0
|
1789 }
|
Daniel@0
|
1790 ksort($this->headerNames);
|
Daniel@0
|
1791 return parent::__toString().$cookies;
|
Daniel@0
|
1792 }
|
Daniel@0
|
1793 public function allPreserveCase()
|
Daniel@0
|
1794 {
|
Daniel@0
|
1795 return array_combine($this->headerNames, $this->headers);
|
Daniel@0
|
1796 }
|
Daniel@0
|
1797 public function replace(array $headers = array())
|
Daniel@0
|
1798 {
|
Daniel@0
|
1799 $this->headerNames = array();
|
Daniel@0
|
1800 parent::replace($headers);
|
Daniel@0
|
1801 if (!isset($this->headers['cache-control'])) {
|
Daniel@0
|
1802 $this->set('Cache-Control','');
|
Daniel@0
|
1803 }
|
Daniel@0
|
1804 }
|
Daniel@0
|
1805 public function set($key, $values, $replace = true)
|
Daniel@0
|
1806 {
|
Daniel@0
|
1807 parent::set($key, $values, $replace);
|
Daniel@0
|
1808 $uniqueKey = strtr(strtolower($key),'_','-');
|
Daniel@0
|
1809 $this->headerNames[$uniqueKey] = $key;
|
Daniel@0
|
1810 if (in_array($uniqueKey, array('cache-control','etag','last-modified','expires'))) {
|
Daniel@0
|
1811 $computed = $this->computeCacheControlValue();
|
Daniel@0
|
1812 $this->headers['cache-control'] = array($computed);
|
Daniel@0
|
1813 $this->headerNames['cache-control'] ='Cache-Control';
|
Daniel@0
|
1814 $this->computedCacheControl = $this->parseCacheControl($computed);
|
Daniel@0
|
1815 }
|
Daniel@0
|
1816 }
|
Daniel@0
|
1817 public function remove($key)
|
Daniel@0
|
1818 {
|
Daniel@0
|
1819 parent::remove($key);
|
Daniel@0
|
1820 $uniqueKey = strtr(strtolower($key),'_','-');
|
Daniel@0
|
1821 unset($this->headerNames[$uniqueKey]);
|
Daniel@0
|
1822 if ('cache-control'=== $uniqueKey) {
|
Daniel@0
|
1823 $this->computedCacheControl = array();
|
Daniel@0
|
1824 }
|
Daniel@0
|
1825 }
|
Daniel@0
|
1826 public function hasCacheControlDirective($key)
|
Daniel@0
|
1827 {
|
Daniel@0
|
1828 return array_key_exists($key, $this->computedCacheControl);
|
Daniel@0
|
1829 }
|
Daniel@0
|
1830 public function getCacheControlDirective($key)
|
Daniel@0
|
1831 {
|
Daniel@0
|
1832 return array_key_exists($key, $this->computedCacheControl) ? $this->computedCacheControl[$key] : null;
|
Daniel@0
|
1833 }
|
Daniel@0
|
1834 public function setCookie(Cookie $cookie)
|
Daniel@0
|
1835 {
|
Daniel@0
|
1836 $this->cookies[$cookie->getDomain()][$cookie->getPath()][$cookie->getName()] = $cookie;
|
Daniel@0
|
1837 }
|
Daniel@0
|
1838 public function removeCookie($name, $path ='/', $domain = null)
|
Daniel@0
|
1839 {
|
Daniel@0
|
1840 if (null === $path) {
|
Daniel@0
|
1841 $path ='/';
|
Daniel@0
|
1842 }
|
Daniel@0
|
1843 unset($this->cookies[$domain][$path][$name]);
|
Daniel@0
|
1844 if (empty($this->cookies[$domain][$path])) {
|
Daniel@0
|
1845 unset($this->cookies[$domain][$path]);
|
Daniel@0
|
1846 if (empty($this->cookies[$domain])) {
|
Daniel@0
|
1847 unset($this->cookies[$domain]);
|
Daniel@0
|
1848 }
|
Daniel@0
|
1849 }
|
Daniel@0
|
1850 }
|
Daniel@0
|
1851 public function getCookies($format = self::COOKIES_FLAT)
|
Daniel@0
|
1852 {
|
Daniel@0
|
1853 if (!in_array($format, array(self::COOKIES_FLAT, self::COOKIES_ARRAY))) {
|
Daniel@0
|
1854 throw new \InvalidArgumentException(sprintf('Format "%s" invalid (%s).', $format, implode(', ', array(self::COOKIES_FLAT, self::COOKIES_ARRAY))));
|
Daniel@0
|
1855 }
|
Daniel@0
|
1856 if (self::COOKIES_ARRAY === $format) {
|
Daniel@0
|
1857 return $this->cookies;
|
Daniel@0
|
1858 }
|
Daniel@0
|
1859 $flattenedCookies = array();
|
Daniel@0
|
1860 foreach ($this->cookies as $path) {
|
Daniel@0
|
1861 foreach ($path as $cookies) {
|
Daniel@0
|
1862 foreach ($cookies as $cookie) {
|
Daniel@0
|
1863 $flattenedCookies[] = $cookie;
|
Daniel@0
|
1864 }
|
Daniel@0
|
1865 }
|
Daniel@0
|
1866 }
|
Daniel@0
|
1867 return $flattenedCookies;
|
Daniel@0
|
1868 }
|
Daniel@0
|
1869 public function clearCookie($name, $path ='/', $domain = null)
|
Daniel@0
|
1870 {
|
Daniel@0
|
1871 $this->setCookie(new Cookie($name, null, 1, $path, $domain));
|
Daniel@0
|
1872 }
|
Daniel@0
|
1873 public function makeDisposition($disposition, $filename, $filenameFallback ='')
|
Daniel@0
|
1874 {
|
Daniel@0
|
1875 if (!in_array($disposition, array(self::DISPOSITION_ATTACHMENT, self::DISPOSITION_INLINE))) {
|
Daniel@0
|
1876 throw new \InvalidArgumentException(sprintf('The disposition must be either "%s" or "%s".', self::DISPOSITION_ATTACHMENT, self::DISPOSITION_INLINE));
|
Daniel@0
|
1877 }
|
Daniel@0
|
1878 if (''== $filenameFallback) {
|
Daniel@0
|
1879 $filenameFallback = $filename;
|
Daniel@0
|
1880 }
|
Daniel@0
|
1881 if (!preg_match('/^[\x20-\x7e]*$/', $filenameFallback)) {
|
Daniel@0
|
1882 throw new \InvalidArgumentException('The filename fallback must only contain ASCII characters.');
|
Daniel@0
|
1883 }
|
Daniel@0
|
1884 if (false !== strpos($filenameFallback,'%')) {
|
Daniel@0
|
1885 throw new \InvalidArgumentException('The filename fallback cannot contain the "%" character.');
|
Daniel@0
|
1886 }
|
Daniel@0
|
1887 if (false !== strpos($filename,'/') || false !== strpos($filename,'\\') || false !== strpos($filenameFallback,'/') || false !== strpos($filenameFallback,'\\')) {
|
Daniel@0
|
1888 throw new \InvalidArgumentException('The filename and the fallback cannot contain the "/" and "\\" characters.');
|
Daniel@0
|
1889 }
|
Daniel@0
|
1890 $output = sprintf('%s; filename="%s"', $disposition, str_replace('"','\\"', $filenameFallback));
|
Daniel@0
|
1891 if ($filename !== $filenameFallback) {
|
Daniel@0
|
1892 $output .= sprintf("; filename*=utf-8''%s", rawurlencode($filename));
|
Daniel@0
|
1893 }
|
Daniel@0
|
1894 return $output;
|
Daniel@0
|
1895 }
|
Daniel@0
|
1896 protected function computeCacheControlValue()
|
Daniel@0
|
1897 {
|
Daniel@0
|
1898 if (!$this->cacheControl && !$this->has('ETag') && !$this->has('Last-Modified') && !$this->has('Expires')) {
|
Daniel@0
|
1899 return'no-cache';
|
Daniel@0
|
1900 }
|
Daniel@0
|
1901 if (!$this->cacheControl) {
|
Daniel@0
|
1902 return'private, must-revalidate';
|
Daniel@0
|
1903 }
|
Daniel@0
|
1904 $header = $this->getCacheControlHeader();
|
Daniel@0
|
1905 if (isset($this->cacheControl['public']) || isset($this->cacheControl['private'])) {
|
Daniel@0
|
1906 return $header;
|
Daniel@0
|
1907 }
|
Daniel@0
|
1908 if (!isset($this->cacheControl['s-maxage'])) {
|
Daniel@0
|
1909 return $header.', private';
|
Daniel@0
|
1910 }
|
Daniel@0
|
1911 return $header;
|
Daniel@0
|
1912 }
|
Daniel@0
|
1913 }
|
Daniel@0
|
1914 }
|
Daniel@0
|
1915 namespace Symfony\Component\DependencyInjection
|
Daniel@0
|
1916 {
|
Daniel@0
|
1917 interface ContainerAwareInterface
|
Daniel@0
|
1918 {
|
Daniel@0
|
1919 public function setContainer(ContainerInterface $container = null);
|
Daniel@0
|
1920 }
|
Daniel@0
|
1921 }
|
Daniel@0
|
1922 namespace Symfony\Component\DependencyInjection
|
Daniel@0
|
1923 {
|
Daniel@0
|
1924 use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;
|
Daniel@0
|
1925 use Symfony\Component\DependencyInjection\Exception\ServiceCircularReferenceException;
|
Daniel@0
|
1926 use Symfony\Component\DependencyInjection\Exception\ServiceNotFoundException;
|
Daniel@0
|
1927 interface ContainerInterface
|
Daniel@0
|
1928 {
|
Daniel@0
|
1929 const EXCEPTION_ON_INVALID_REFERENCE = 1;
|
Daniel@0
|
1930 const NULL_ON_INVALID_REFERENCE = 2;
|
Daniel@0
|
1931 const IGNORE_ON_INVALID_REFERENCE = 3;
|
Daniel@0
|
1932 const SCOPE_CONTAINER ='container';
|
Daniel@0
|
1933 const SCOPE_PROTOTYPE ='prototype';
|
Daniel@0
|
1934 public function set($id, $service, $scope = self::SCOPE_CONTAINER);
|
Daniel@0
|
1935 public function get($id, $invalidBehavior = self::EXCEPTION_ON_INVALID_REFERENCE);
|
Daniel@0
|
1936 public function has($id);
|
Daniel@0
|
1937 public function getParameter($name);
|
Daniel@0
|
1938 public function hasParameter($name);
|
Daniel@0
|
1939 public function setParameter($name, $value);
|
Daniel@0
|
1940 public function enterScope($name);
|
Daniel@0
|
1941 public function leaveScope($name);
|
Daniel@0
|
1942 public function addScope(ScopeInterface $scope);
|
Daniel@0
|
1943 public function hasScope($name);
|
Daniel@0
|
1944 public function isScopeActive($name);
|
Daniel@0
|
1945 }
|
Daniel@0
|
1946 }
|
Daniel@0
|
1947 namespace Symfony\Component\DependencyInjection
|
Daniel@0
|
1948 {
|
Daniel@0
|
1949 interface IntrospectableContainerInterface extends ContainerInterface
|
Daniel@0
|
1950 {
|
Daniel@0
|
1951 public function initialized($id);
|
Daniel@0
|
1952 }
|
Daniel@0
|
1953 }
|
Daniel@0
|
1954 namespace Symfony\Component\DependencyInjection
|
Daniel@0
|
1955 {
|
Daniel@0
|
1956 use Symfony\Component\DependencyInjection\Exception\InactiveScopeException;
|
Daniel@0
|
1957 use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;
|
Daniel@0
|
1958 use Symfony\Component\DependencyInjection\Exception\RuntimeException;
|
Daniel@0
|
1959 use Symfony\Component\DependencyInjection\Exception\ServiceNotFoundException;
|
Daniel@0
|
1960 use Symfony\Component\DependencyInjection\Exception\ServiceCircularReferenceException;
|
Daniel@0
|
1961 use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
|
Daniel@0
|
1962 use Symfony\Component\DependencyInjection\ParameterBag\ParameterBag;
|
Daniel@0
|
1963 use Symfony\Component\DependencyInjection\ParameterBag\FrozenParameterBag;
|
Daniel@0
|
1964 class Container implements IntrospectableContainerInterface
|
Daniel@0
|
1965 {
|
Daniel@0
|
1966 protected $parameterBag;
|
Daniel@0
|
1967 protected $services = array();
|
Daniel@0
|
1968 protected $methodMap = array();
|
Daniel@0
|
1969 protected $aliases = array();
|
Daniel@0
|
1970 protected $scopes = array();
|
Daniel@0
|
1971 protected $scopeChildren = array();
|
Daniel@0
|
1972 protected $scopedServices = array();
|
Daniel@0
|
1973 protected $scopeStacks = array();
|
Daniel@0
|
1974 protected $loading = array();
|
Daniel@0
|
1975 public function __construct(ParameterBagInterface $parameterBag = null)
|
Daniel@0
|
1976 {
|
Daniel@0
|
1977 $this->parameterBag = $parameterBag ?: new ParameterBag();
|
Daniel@0
|
1978 $this->set('service_container', $this);
|
Daniel@0
|
1979 }
|
Daniel@0
|
1980 public function compile()
|
Daniel@0
|
1981 {
|
Daniel@0
|
1982 $this->parameterBag->resolve();
|
Daniel@0
|
1983 $this->parameterBag = new FrozenParameterBag($this->parameterBag->all());
|
Daniel@0
|
1984 }
|
Daniel@0
|
1985 public function isFrozen()
|
Daniel@0
|
1986 {
|
Daniel@0
|
1987 return $this->parameterBag instanceof FrozenParameterBag;
|
Daniel@0
|
1988 }
|
Daniel@0
|
1989 public function getParameterBag()
|
Daniel@0
|
1990 {
|
Daniel@0
|
1991 return $this->parameterBag;
|
Daniel@0
|
1992 }
|
Daniel@0
|
1993 public function getParameter($name)
|
Daniel@0
|
1994 {
|
Daniel@0
|
1995 return $this->parameterBag->get($name);
|
Daniel@0
|
1996 }
|
Daniel@0
|
1997 public function hasParameter($name)
|
Daniel@0
|
1998 {
|
Daniel@0
|
1999 return $this->parameterBag->has($name);
|
Daniel@0
|
2000 }
|
Daniel@0
|
2001 public function setParameter($name, $value)
|
Daniel@0
|
2002 {
|
Daniel@0
|
2003 $this->parameterBag->set($name, $value);
|
Daniel@0
|
2004 }
|
Daniel@0
|
2005 public function set($id, $service, $scope = self::SCOPE_CONTAINER)
|
Daniel@0
|
2006 {
|
Daniel@0
|
2007 if (self::SCOPE_PROTOTYPE === $scope) {
|
Daniel@0
|
2008 throw new InvalidArgumentException(sprintf('You cannot set service "%s" of scope "prototype".', $id));
|
Daniel@0
|
2009 }
|
Daniel@0
|
2010 $id = strtolower($id);
|
Daniel@0
|
2011 if ('service_container'=== $id) {
|
Daniel@0
|
2012 return;
|
Daniel@0
|
2013 }
|
Daniel@0
|
2014 if (self::SCOPE_CONTAINER !== $scope) {
|
Daniel@0
|
2015 if (!isset($this->scopedServices[$scope])) {
|
Daniel@0
|
2016 throw new RuntimeException(sprintf('You cannot set service "%s" of inactive scope.', $id));
|
Daniel@0
|
2017 }
|
Daniel@0
|
2018 $this->scopedServices[$scope][$id] = $service;
|
Daniel@0
|
2019 }
|
Daniel@0
|
2020 $this->services[$id] = $service;
|
Daniel@0
|
2021 if (method_exists($this, $method ='synchronize'.strtr($id, array('_'=>'','.'=>'_','\\'=>'_')).'Service')) {
|
Daniel@0
|
2022 $this->$method();
|
Daniel@0
|
2023 }
|
Daniel@0
|
2024 if (self::SCOPE_CONTAINER !== $scope && null === $service) {
|
Daniel@0
|
2025 unset($this->scopedServices[$scope][$id]);
|
Daniel@0
|
2026 }
|
Daniel@0
|
2027 if (null === $service) {
|
Daniel@0
|
2028 unset($this->services[$id]);
|
Daniel@0
|
2029 }
|
Daniel@0
|
2030 }
|
Daniel@0
|
2031 public function has($id)
|
Daniel@0
|
2032 {
|
Daniel@0
|
2033 $id = strtolower($id);
|
Daniel@0
|
2034 if ('service_container'=== $id) {
|
Daniel@0
|
2035 return true;
|
Daniel@0
|
2036 }
|
Daniel@0
|
2037 return isset($this->services[$id])
|
Daniel@0
|
2038 || array_key_exists($id, $this->services)
|
Daniel@0
|
2039 || isset($this->aliases[$id])
|
Daniel@0
|
2040 || method_exists($this,'get'.strtr($id, array('_'=>'','.'=>'_','\\'=>'_')).'Service')
|
Daniel@0
|
2041 ;
|
Daniel@0
|
2042 }
|
Daniel@0
|
2043 public function get($id, $invalidBehavior = self::EXCEPTION_ON_INVALID_REFERENCE)
|
Daniel@0
|
2044 {
|
Daniel@0
|
2045 foreach (array(false, true) as $strtolower) {
|
Daniel@0
|
2046 if ($strtolower) {
|
Daniel@0
|
2047 $id = strtolower($id);
|
Daniel@0
|
2048 }
|
Daniel@0
|
2049 if ('service_container'=== $id) {
|
Daniel@0
|
2050 return $this;
|
Daniel@0
|
2051 }
|
Daniel@0
|
2052 if (isset($this->aliases[$id])) {
|
Daniel@0
|
2053 $id = $this->aliases[$id];
|
Daniel@0
|
2054 }
|
Daniel@0
|
2055 if (isset($this->services[$id]) || array_key_exists($id, $this->services)) {
|
Daniel@0
|
2056 return $this->services[$id];
|
Daniel@0
|
2057 }
|
Daniel@0
|
2058 }
|
Daniel@0
|
2059 if (isset($this->loading[$id])) {
|
Daniel@0
|
2060 throw new ServiceCircularReferenceException($id, array_keys($this->loading));
|
Daniel@0
|
2061 }
|
Daniel@0
|
2062 if (isset($this->methodMap[$id])) {
|
Daniel@0
|
2063 $method = $this->methodMap[$id];
|
Daniel@0
|
2064 } elseif (method_exists($this, $method ='get'.strtr($id, array('_'=>'','.'=>'_','\\'=>'_')).'Service')) {
|
Daniel@0
|
2065 } else {
|
Daniel@0
|
2066 if (self::EXCEPTION_ON_INVALID_REFERENCE === $invalidBehavior) {
|
Daniel@0
|
2067 if (!$id) {
|
Daniel@0
|
2068 throw new ServiceNotFoundException($id);
|
Daniel@0
|
2069 }
|
Daniel@0
|
2070 $alternatives = array();
|
Daniel@0
|
2071 foreach (array_keys($this->services) as $key) {
|
Daniel@0
|
2072 $lev = levenshtein($id, $key);
|
Daniel@0
|
2073 if ($lev <= strlen($id) / 3 || false !== strpos($key, $id)) {
|
Daniel@0
|
2074 $alternatives[] = $key;
|
Daniel@0
|
2075 }
|
Daniel@0
|
2076 }
|
Daniel@0
|
2077 throw new ServiceNotFoundException($id, null, null, $alternatives);
|
Daniel@0
|
2078 }
|
Daniel@0
|
2079 return;
|
Daniel@0
|
2080 }
|
Daniel@0
|
2081 $this->loading[$id] = true;
|
Daniel@0
|
2082 try {
|
Daniel@0
|
2083 $service = $this->$method();
|
Daniel@0
|
2084 } catch (\Exception $e) {
|
Daniel@0
|
2085 unset($this->loading[$id]);
|
Daniel@0
|
2086 if (array_key_exists($id, $this->services)) {
|
Daniel@0
|
2087 unset($this->services[$id]);
|
Daniel@0
|
2088 }
|
Daniel@0
|
2089 if ($e instanceof InactiveScopeException && self::EXCEPTION_ON_INVALID_REFERENCE !== $invalidBehavior) {
|
Daniel@0
|
2090 return;
|
Daniel@0
|
2091 }
|
Daniel@0
|
2092 throw $e;
|
Daniel@0
|
2093 }
|
Daniel@0
|
2094 unset($this->loading[$id]);
|
Daniel@0
|
2095 return $service;
|
Daniel@0
|
2096 }
|
Daniel@0
|
2097 public function initialized($id)
|
Daniel@0
|
2098 {
|
Daniel@0
|
2099 $id = strtolower($id);
|
Daniel@0
|
2100 if ('service_container'=== $id) {
|
Daniel@0
|
2101 return true;
|
Daniel@0
|
2102 }
|
Daniel@0
|
2103 if (isset($this->aliases[$id])) {
|
Daniel@0
|
2104 $id = $this->aliases[$id];
|
Daniel@0
|
2105 }
|
Daniel@0
|
2106 return isset($this->services[$id]) || array_key_exists($id, $this->services);
|
Daniel@0
|
2107 }
|
Daniel@0
|
2108 public function getServiceIds()
|
Daniel@0
|
2109 {
|
Daniel@0
|
2110 $ids = array();
|
Daniel@0
|
2111 $r = new \ReflectionClass($this);
|
Daniel@0
|
2112 foreach ($r->getMethods() as $method) {
|
Daniel@0
|
2113 if (preg_match('/^get(.+)Service$/', $method->name, $match)) {
|
Daniel@0
|
2114 $ids[] = self::underscore($match[1]);
|
Daniel@0
|
2115 }
|
Daniel@0
|
2116 }
|
Daniel@0
|
2117 $ids[] ='service_container';
|
Daniel@0
|
2118 return array_unique(array_merge($ids, array_keys($this->services)));
|
Daniel@0
|
2119 }
|
Daniel@0
|
2120 public function enterScope($name)
|
Daniel@0
|
2121 {
|
Daniel@0
|
2122 if (!isset($this->scopes[$name])) {
|
Daniel@0
|
2123 throw new InvalidArgumentException(sprintf('The scope "%s" does not exist.', $name));
|
Daniel@0
|
2124 }
|
Daniel@0
|
2125 if (self::SCOPE_CONTAINER !== $this->scopes[$name] && !isset($this->scopedServices[$this->scopes[$name]])) {
|
Daniel@0
|
2126 throw new RuntimeException(sprintf('The parent scope "%s" must be active when entering this scope.', $this->scopes[$name]));
|
Daniel@0
|
2127 }
|
Daniel@0
|
2128 if (isset($this->scopedServices[$name])) {
|
Daniel@0
|
2129 $services = array($this->services, $name => $this->scopedServices[$name]);
|
Daniel@0
|
2130 unset($this->scopedServices[$name]);
|
Daniel@0
|
2131 foreach ($this->scopeChildren[$name] as $child) {
|
Daniel@0
|
2132 if (isset($this->scopedServices[$child])) {
|
Daniel@0
|
2133 $services[$child] = $this->scopedServices[$child];
|
Daniel@0
|
2134 unset($this->scopedServices[$child]);
|
Daniel@0
|
2135 }
|
Daniel@0
|
2136 }
|
Daniel@0
|
2137 $this->services = call_user_func_array('array_diff_key', $services);
|
Daniel@0
|
2138 array_shift($services);
|
Daniel@0
|
2139 if (!isset($this->scopeStacks[$name])) {
|
Daniel@0
|
2140 $this->scopeStacks[$name] = new \SplStack();
|
Daniel@0
|
2141 }
|
Daniel@0
|
2142 $this->scopeStacks[$name]->push($services);
|
Daniel@0
|
2143 }
|
Daniel@0
|
2144 $this->scopedServices[$name] = array();
|
Daniel@0
|
2145 }
|
Daniel@0
|
2146 public function leaveScope($name)
|
Daniel@0
|
2147 {
|
Daniel@0
|
2148 if (!isset($this->scopedServices[$name])) {
|
Daniel@0
|
2149 throw new InvalidArgumentException(sprintf('The scope "%s" is not active.', $name));
|
Daniel@0
|
2150 }
|
Daniel@0
|
2151 $services = array($this->services, $this->scopedServices[$name]);
|
Daniel@0
|
2152 unset($this->scopedServices[$name]);
|
Daniel@0
|
2153 foreach ($this->scopeChildren[$name] as $child) {
|
Daniel@0
|
2154 if (!isset($this->scopedServices[$child])) {
|
Daniel@0
|
2155 continue;
|
Daniel@0
|
2156 }
|
Daniel@0
|
2157 $services[] = $this->scopedServices[$child];
|
Daniel@0
|
2158 unset($this->scopedServices[$child]);
|
Daniel@0
|
2159 }
|
Daniel@0
|
2160 $this->services = call_user_func_array('array_diff_key', $services);
|
Daniel@0
|
2161 if (isset($this->scopeStacks[$name]) && count($this->scopeStacks[$name]) > 0) {
|
Daniel@0
|
2162 $services = $this->scopeStacks[$name]->pop();
|
Daniel@0
|
2163 $this->scopedServices += $services;
|
Daniel@0
|
2164 foreach ($services as $array) {
|
Daniel@0
|
2165 foreach ($array as $id => $service) {
|
Daniel@0
|
2166 $this->set($id, $service, $name);
|
Daniel@0
|
2167 }
|
Daniel@0
|
2168 }
|
Daniel@0
|
2169 }
|
Daniel@0
|
2170 }
|
Daniel@0
|
2171 public function addScope(ScopeInterface $scope)
|
Daniel@0
|
2172 {
|
Daniel@0
|
2173 $name = $scope->getName();
|
Daniel@0
|
2174 $parentScope = $scope->getParentName();
|
Daniel@0
|
2175 if (self::SCOPE_CONTAINER === $name || self::SCOPE_PROTOTYPE === $name) {
|
Daniel@0
|
2176 throw new InvalidArgumentException(sprintf('The scope "%s" is reserved.', $name));
|
Daniel@0
|
2177 }
|
Daniel@0
|
2178 if (isset($this->scopes[$name])) {
|
Daniel@0
|
2179 throw new InvalidArgumentException(sprintf('A scope with name "%s" already exists.', $name));
|
Daniel@0
|
2180 }
|
Daniel@0
|
2181 if (self::SCOPE_CONTAINER !== $parentScope && !isset($this->scopes[$parentScope])) {
|
Daniel@0
|
2182 throw new InvalidArgumentException(sprintf('The parent scope "%s" does not exist, or is invalid.', $parentScope));
|
Daniel@0
|
2183 }
|
Daniel@0
|
2184 $this->scopes[$name] = $parentScope;
|
Daniel@0
|
2185 $this->scopeChildren[$name] = array();
|
Daniel@0
|
2186 while ($parentScope !== self::SCOPE_CONTAINER) {
|
Daniel@0
|
2187 $this->scopeChildren[$parentScope][] = $name;
|
Daniel@0
|
2188 $parentScope = $this->scopes[$parentScope];
|
Daniel@0
|
2189 }
|
Daniel@0
|
2190 }
|
Daniel@0
|
2191 public function hasScope($name)
|
Daniel@0
|
2192 {
|
Daniel@0
|
2193 return isset($this->scopes[$name]);
|
Daniel@0
|
2194 }
|
Daniel@0
|
2195 public function isScopeActive($name)
|
Daniel@0
|
2196 {
|
Daniel@0
|
2197 return isset($this->scopedServices[$name]);
|
Daniel@0
|
2198 }
|
Daniel@0
|
2199 public static function camelize($id)
|
Daniel@0
|
2200 {
|
Daniel@0
|
2201 return strtr(ucwords(strtr($id, array('_'=>' ','.'=>'_ ','\\'=>'_ '))), array(' '=>''));
|
Daniel@0
|
2202 }
|
Daniel@0
|
2203 public static function underscore($id)
|
Daniel@0
|
2204 {
|
Daniel@0
|
2205 return strtolower(preg_replace(array('/([A-Z]+)([A-Z][a-z])/','/([a-z\d])([A-Z])/'), array('\\1_\\2','\\1_\\2'), strtr($id,'_','.')));
|
Daniel@0
|
2206 }
|
Daniel@0
|
2207 }
|
Daniel@0
|
2208 }
|
Daniel@0
|
2209 namespace Symfony\Component\HttpKernel
|
Daniel@0
|
2210 {
|
Daniel@0
|
2211 use Symfony\Component\HttpFoundation\Request;
|
Daniel@0
|
2212 use Symfony\Component\HttpFoundation\Response;
|
Daniel@0
|
2213 interface HttpKernelInterface
|
Daniel@0
|
2214 {
|
Daniel@0
|
2215 const MASTER_REQUEST = 1;
|
Daniel@0
|
2216 const SUB_REQUEST = 2;
|
Daniel@0
|
2217 public function handle(Request $request, $type = self::MASTER_REQUEST, $catch = true);
|
Daniel@0
|
2218 }
|
Daniel@0
|
2219 }
|
Daniel@0
|
2220 namespace Symfony\Component\HttpKernel
|
Daniel@0
|
2221 {
|
Daniel@0
|
2222 use Symfony\Component\DependencyInjection\ContainerInterface;
|
Daniel@0
|
2223 use Symfony\Component\HttpKernel\Bundle\BundleInterface;
|
Daniel@0
|
2224 use Symfony\Component\Config\Loader\LoaderInterface;
|
Daniel@0
|
2225 interface KernelInterface extends HttpKernelInterface, \Serializable
|
Daniel@0
|
2226 {
|
Daniel@0
|
2227 public function registerBundles();
|
Daniel@0
|
2228 public function registerContainerConfiguration(LoaderInterface $loader);
|
Daniel@0
|
2229 public function boot();
|
Daniel@0
|
2230 public function shutdown();
|
Daniel@0
|
2231 public function getBundles();
|
Daniel@0
|
2232 public function isClassInActiveBundle($class);
|
Daniel@0
|
2233 public function getBundle($name, $first = true);
|
Daniel@0
|
2234 public function locateResource($name, $dir = null, $first = true);
|
Daniel@0
|
2235 public function getName();
|
Daniel@0
|
2236 public function getEnvironment();
|
Daniel@0
|
2237 public function isDebug();
|
Daniel@0
|
2238 public function getRootDir();
|
Daniel@0
|
2239 public function getContainer();
|
Daniel@0
|
2240 public function getStartTime();
|
Daniel@0
|
2241 public function getCacheDir();
|
Daniel@0
|
2242 public function getLogDir();
|
Daniel@0
|
2243 public function getCharset();
|
Daniel@0
|
2244 }
|
Daniel@0
|
2245 }
|
Daniel@0
|
2246 namespace Symfony\Component\HttpKernel
|
Daniel@0
|
2247 {
|
Daniel@0
|
2248 use Symfony\Component\HttpFoundation\Request;
|
Daniel@0
|
2249 use Symfony\Component\HttpFoundation\Response;
|
Daniel@0
|
2250 interface TerminableInterface
|
Daniel@0
|
2251 {
|
Daniel@0
|
2252 public function terminate(Request $request, Response $response);
|
Daniel@0
|
2253 }
|
Daniel@0
|
2254 }
|
Daniel@0
|
2255 namespace Symfony\Component\HttpKernel
|
Daniel@0
|
2256 {
|
Daniel@0
|
2257 use Symfony\Bridge\ProxyManager\LazyProxy\Instantiator\RuntimeInstantiator;
|
Daniel@0
|
2258 use Symfony\Bridge\ProxyManager\LazyProxy\PhpDumper\ProxyDumper;
|
Daniel@0
|
2259 use Symfony\Component\DependencyInjection\ContainerInterface;
|
Daniel@0
|
2260 use Symfony\Component\DependencyInjection\ContainerBuilder;
|
Daniel@0
|
2261 use Symfony\Component\DependencyInjection\Dumper\PhpDumper;
|
Daniel@0
|
2262 use Symfony\Component\DependencyInjection\ParameterBag\ParameterBag;
|
Daniel@0
|
2263 use Symfony\Component\DependencyInjection\Loader\XmlFileLoader;
|
Daniel@0
|
2264 use Symfony\Component\DependencyInjection\Loader\YamlFileLoader;
|
Daniel@0
|
2265 use Symfony\Component\DependencyInjection\Loader\IniFileLoader;
|
Daniel@0
|
2266 use Symfony\Component\DependencyInjection\Loader\PhpFileLoader;
|
Daniel@0
|
2267 use Symfony\Component\DependencyInjection\Loader\ClosureLoader;
|
Daniel@0
|
2268 use Symfony\Component\HttpFoundation\Request;
|
Daniel@0
|
2269 use Symfony\Component\HttpFoundation\Response;
|
Daniel@0
|
2270 use Symfony\Component\HttpKernel\Bundle\BundleInterface;
|
Daniel@0
|
2271 use Symfony\Component\HttpKernel\Config\EnvParametersResource;
|
Daniel@0
|
2272 use Symfony\Component\HttpKernel\Config\FileLocator;
|
Daniel@0
|
2273 use Symfony\Component\HttpKernel\DependencyInjection\MergeExtensionConfigurationPass;
|
Daniel@0
|
2274 use Symfony\Component\HttpKernel\DependencyInjection\AddClassesToCachePass;
|
Daniel@0
|
2275 use Symfony\Component\Config\Loader\LoaderResolver;
|
Daniel@0
|
2276 use Symfony\Component\Config\Loader\DelegatingLoader;
|
Daniel@0
|
2277 use Symfony\Component\Config\ConfigCache;
|
Daniel@0
|
2278 use Symfony\Component\ClassLoader\ClassCollectionLoader;
|
Daniel@0
|
2279 abstract class Kernel implements KernelInterface, TerminableInterface
|
Daniel@0
|
2280 {
|
Daniel@0
|
2281 protected $bundles = array();
|
Daniel@0
|
2282 protected $bundleMap;
|
Daniel@0
|
2283 protected $container;
|
Daniel@0
|
2284 protected $rootDir;
|
Daniel@0
|
2285 protected $environment;
|
Daniel@0
|
2286 protected $debug;
|
Daniel@0
|
2287 protected $booted = false;
|
Daniel@0
|
2288 protected $name;
|
Daniel@0
|
2289 protected $startTime;
|
Daniel@0
|
2290 protected $loadClassCache;
|
Daniel@0
|
2291 const VERSION ='2.5.10';
|
Daniel@0
|
2292 const VERSION_ID ='20510';
|
Daniel@0
|
2293 const MAJOR_VERSION ='2';
|
Daniel@0
|
2294 const MINOR_VERSION ='5';
|
Daniel@0
|
2295 const RELEASE_VERSION ='10';
|
Daniel@0
|
2296 const EXTRA_VERSION ='';
|
Daniel@0
|
2297 public function __construct($environment, $debug)
|
Daniel@0
|
2298 {
|
Daniel@0
|
2299 $this->environment = $environment;
|
Daniel@0
|
2300 $this->debug = (bool) $debug;
|
Daniel@0
|
2301 $this->rootDir = $this->getRootDir();
|
Daniel@0
|
2302 $this->name = $this->getName();
|
Daniel@0
|
2303 if ($this->debug) {
|
Daniel@0
|
2304 $this->startTime = microtime(true);
|
Daniel@0
|
2305 }
|
Daniel@0
|
2306 $this->init();
|
Daniel@0
|
2307 }
|
Daniel@0
|
2308 public function init()
|
Daniel@0
|
2309 {
|
Daniel@0
|
2310 }
|
Daniel@0
|
2311 public function __clone()
|
Daniel@0
|
2312 {
|
Daniel@0
|
2313 if ($this->debug) {
|
Daniel@0
|
2314 $this->startTime = microtime(true);
|
Daniel@0
|
2315 }
|
Daniel@0
|
2316 $this->booted = false;
|
Daniel@0
|
2317 $this->container = null;
|
Daniel@0
|
2318 }
|
Daniel@0
|
2319 public function boot()
|
Daniel@0
|
2320 {
|
Daniel@0
|
2321 if (true === $this->booted) {
|
Daniel@0
|
2322 return;
|
Daniel@0
|
2323 }
|
Daniel@0
|
2324 if ($this->loadClassCache) {
|
Daniel@0
|
2325 $this->doLoadClassCache($this->loadClassCache[0], $this->loadClassCache[1]);
|
Daniel@0
|
2326 }
|
Daniel@0
|
2327 $this->initializeBundles();
|
Daniel@0
|
2328 $this->initializeContainer();
|
Daniel@0
|
2329 foreach ($this->getBundles() as $bundle) {
|
Daniel@0
|
2330 $bundle->setContainer($this->container);
|
Daniel@0
|
2331 $bundle->boot();
|
Daniel@0
|
2332 }
|
Daniel@0
|
2333 $this->booted = true;
|
Daniel@0
|
2334 }
|
Daniel@0
|
2335 public function terminate(Request $request, Response $response)
|
Daniel@0
|
2336 {
|
Daniel@0
|
2337 if (false === $this->booted) {
|
Daniel@0
|
2338 return;
|
Daniel@0
|
2339 }
|
Daniel@0
|
2340 if ($this->getHttpKernel() instanceof TerminableInterface) {
|
Daniel@0
|
2341 $this->getHttpKernel()->terminate($request, $response);
|
Daniel@0
|
2342 }
|
Daniel@0
|
2343 }
|
Daniel@0
|
2344 public function shutdown()
|
Daniel@0
|
2345 {
|
Daniel@0
|
2346 if (false === $this->booted) {
|
Daniel@0
|
2347 return;
|
Daniel@0
|
2348 }
|
Daniel@0
|
2349 $this->booted = false;
|
Daniel@0
|
2350 foreach ($this->getBundles() as $bundle) {
|
Daniel@0
|
2351 $bundle->shutdown();
|
Daniel@0
|
2352 $bundle->setContainer(null);
|
Daniel@0
|
2353 }
|
Daniel@0
|
2354 $this->container = null;
|
Daniel@0
|
2355 }
|
Daniel@0
|
2356 public function handle(Request $request, $type = HttpKernelInterface::MASTER_REQUEST, $catch = true)
|
Daniel@0
|
2357 {
|
Daniel@0
|
2358 if (false === $this->booted) {
|
Daniel@0
|
2359 $this->boot();
|
Daniel@0
|
2360 }
|
Daniel@0
|
2361 return $this->getHttpKernel()->handle($request, $type, $catch);
|
Daniel@0
|
2362 }
|
Daniel@0
|
2363 protected function getHttpKernel()
|
Daniel@0
|
2364 {
|
Daniel@0
|
2365 return $this->container->get('http_kernel');
|
Daniel@0
|
2366 }
|
Daniel@0
|
2367 public function getBundles()
|
Daniel@0
|
2368 {
|
Daniel@0
|
2369 return $this->bundles;
|
Daniel@0
|
2370 }
|
Daniel@0
|
2371 public function isClassInActiveBundle($class)
|
Daniel@0
|
2372 {
|
Daniel@0
|
2373 foreach ($this->getBundles() as $bundle) {
|
Daniel@0
|
2374 if (0 === strpos($class, $bundle->getNamespace())) {
|
Daniel@0
|
2375 return true;
|
Daniel@0
|
2376 }
|
Daniel@0
|
2377 }
|
Daniel@0
|
2378 return false;
|
Daniel@0
|
2379 }
|
Daniel@0
|
2380 public function getBundle($name, $first = true)
|
Daniel@0
|
2381 {
|
Daniel@0
|
2382 if (!isset($this->bundleMap[$name])) {
|
Daniel@0
|
2383 throw new \InvalidArgumentException(sprintf('Bundle "%s" does not exist or it is not enabled. Maybe you forgot to add it in the registerBundles() method of your %s.php file?', $name, get_class($this)));
|
Daniel@0
|
2384 }
|
Daniel@0
|
2385 if (true === $first) {
|
Daniel@0
|
2386 return $this->bundleMap[$name][0];
|
Daniel@0
|
2387 }
|
Daniel@0
|
2388 return $this->bundleMap[$name];
|
Daniel@0
|
2389 }
|
Daniel@0
|
2390 public function locateResource($name, $dir = null, $first = true)
|
Daniel@0
|
2391 {
|
Daniel@0
|
2392 if ('@'!== $name[0]) {
|
Daniel@0
|
2393 throw new \InvalidArgumentException(sprintf('A resource name must start with @ ("%s" given).', $name));
|
Daniel@0
|
2394 }
|
Daniel@0
|
2395 if (false !== strpos($name,'..')) {
|
Daniel@0
|
2396 throw new \RuntimeException(sprintf('File name "%s" contains invalid characters (..).', $name));
|
Daniel@0
|
2397 }
|
Daniel@0
|
2398 $bundleName = substr($name, 1);
|
Daniel@0
|
2399 $path ='';
|
Daniel@0
|
2400 if (false !== strpos($bundleName,'/')) {
|
Daniel@0
|
2401 list($bundleName, $path) = explode('/', $bundleName, 2);
|
Daniel@0
|
2402 }
|
Daniel@0
|
2403 $isResource = 0 === strpos($path,'Resources') && null !== $dir;
|
Daniel@0
|
2404 $overridePath = substr($path, 9);
|
Daniel@0
|
2405 $resourceBundle = null;
|
Daniel@0
|
2406 $bundles = $this->getBundle($bundleName, false);
|
Daniel@0
|
2407 $files = array();
|
Daniel@0
|
2408 foreach ($bundles as $bundle) {
|
Daniel@0
|
2409 if ($isResource && file_exists($file = $dir.'/'.$bundle->getName().$overridePath)) {
|
Daniel@0
|
2410 if (null !== $resourceBundle) {
|
Daniel@0
|
2411 throw new \RuntimeException(sprintf('"%s" resource is hidden by a resource from the "%s" derived bundle. Create a "%s" file to override the bundle resource.',
|
Daniel@0
|
2412 $file,
|
Daniel@0
|
2413 $resourceBundle,
|
Daniel@0
|
2414 $dir.'/'.$bundles[0]->getName().$overridePath
|
Daniel@0
|
2415 ));
|
Daniel@0
|
2416 }
|
Daniel@0
|
2417 if ($first) {
|
Daniel@0
|
2418 return $file;
|
Daniel@0
|
2419 }
|
Daniel@0
|
2420 $files[] = $file;
|
Daniel@0
|
2421 }
|
Daniel@0
|
2422 if (file_exists($file = $bundle->getPath().'/'.$path)) {
|
Daniel@0
|
2423 if ($first && !$isResource) {
|
Daniel@0
|
2424 return $file;
|
Daniel@0
|
2425 }
|
Daniel@0
|
2426 $files[] = $file;
|
Daniel@0
|
2427 $resourceBundle = $bundle->getName();
|
Daniel@0
|
2428 }
|
Daniel@0
|
2429 }
|
Daniel@0
|
2430 if (count($files) > 0) {
|
Daniel@0
|
2431 return $first && $isResource ? $files[0] : $files;
|
Daniel@0
|
2432 }
|
Daniel@0
|
2433 throw new \InvalidArgumentException(sprintf('Unable to find file "%s".', $name));
|
Daniel@0
|
2434 }
|
Daniel@0
|
2435 public function getName()
|
Daniel@0
|
2436 {
|
Daniel@0
|
2437 if (null === $this->name) {
|
Daniel@0
|
2438 $this->name = preg_replace('/[^a-zA-Z0-9_]+/','', basename($this->rootDir));
|
Daniel@0
|
2439 }
|
Daniel@0
|
2440 return $this->name;
|
Daniel@0
|
2441 }
|
Daniel@0
|
2442 public function getEnvironment()
|
Daniel@0
|
2443 {
|
Daniel@0
|
2444 return $this->environment;
|
Daniel@0
|
2445 }
|
Daniel@0
|
2446 public function isDebug()
|
Daniel@0
|
2447 {
|
Daniel@0
|
2448 return $this->debug;
|
Daniel@0
|
2449 }
|
Daniel@0
|
2450 public function getRootDir()
|
Daniel@0
|
2451 {
|
Daniel@0
|
2452 if (null === $this->rootDir) {
|
Daniel@0
|
2453 $r = new \ReflectionObject($this);
|
Daniel@0
|
2454 $this->rootDir = str_replace('\\','/', dirname($r->getFileName()));
|
Daniel@0
|
2455 }
|
Daniel@0
|
2456 return $this->rootDir;
|
Daniel@0
|
2457 }
|
Daniel@0
|
2458 public function getContainer()
|
Daniel@0
|
2459 {
|
Daniel@0
|
2460 return $this->container;
|
Daniel@0
|
2461 }
|
Daniel@0
|
2462 public function loadClassCache($name ='classes', $extension ='.php')
|
Daniel@0
|
2463 {
|
Daniel@0
|
2464 $this->loadClassCache = array($name, $extension);
|
Daniel@0
|
2465 }
|
Daniel@0
|
2466 public function setClassCache(array $classes)
|
Daniel@0
|
2467 {
|
Daniel@0
|
2468 file_put_contents($this->getCacheDir().'/classes.map', sprintf('<?php return %s;', var_export($classes, true)));
|
Daniel@0
|
2469 }
|
Daniel@0
|
2470 public function getStartTime()
|
Daniel@0
|
2471 {
|
Daniel@0
|
2472 return $this->debug ? $this->startTime : -INF;
|
Daniel@0
|
2473 }
|
Daniel@0
|
2474 public function getCacheDir()
|
Daniel@0
|
2475 {
|
Daniel@0
|
2476 return $this->rootDir.'/cache/'.$this->environment;
|
Daniel@0
|
2477 }
|
Daniel@0
|
2478 public function getLogDir()
|
Daniel@0
|
2479 {
|
Daniel@0
|
2480 return $this->rootDir.'/logs';
|
Daniel@0
|
2481 }
|
Daniel@0
|
2482 public function getCharset()
|
Daniel@0
|
2483 {
|
Daniel@0
|
2484 return'UTF-8';
|
Daniel@0
|
2485 }
|
Daniel@0
|
2486 protected function doLoadClassCache($name, $extension)
|
Daniel@0
|
2487 {
|
Daniel@0
|
2488 if (!$this->booted && is_file($this->getCacheDir().'/classes.map')) {
|
Daniel@0
|
2489 ClassCollectionLoader::load(include($this->getCacheDir().'/classes.map'), $this->getCacheDir(), $name, $this->debug, false, $extension);
|
Daniel@0
|
2490 }
|
Daniel@0
|
2491 }
|
Daniel@0
|
2492 protected function initializeBundles()
|
Daniel@0
|
2493 {
|
Daniel@0
|
2494 $this->bundles = array();
|
Daniel@0
|
2495 $topMostBundles = array();
|
Daniel@0
|
2496 $directChildren = array();
|
Daniel@0
|
2497 foreach ($this->registerBundles() as $bundle) {
|
Daniel@0
|
2498 $name = $bundle->getName();
|
Daniel@0
|
2499 if (isset($this->bundles[$name])) {
|
Daniel@0
|
2500 throw new \LogicException(sprintf('Trying to register two bundles with the same name "%s"', $name));
|
Daniel@0
|
2501 }
|
Daniel@0
|
2502 $this->bundles[$name] = $bundle;
|
Daniel@0
|
2503 if ($parentName = $bundle->getParent()) {
|
Daniel@0
|
2504 if (isset($directChildren[$parentName])) {
|
Daniel@0
|
2505 throw new \LogicException(sprintf('Bundle "%s" is directly extended by two bundles "%s" and "%s".', $parentName, $name, $directChildren[$parentName]));
|
Daniel@0
|
2506 }
|
Daniel@0
|
2507 if ($parentName == $name) {
|
Daniel@0
|
2508 throw new \LogicException(sprintf('Bundle "%s" can not extend itself.', $name));
|
Daniel@0
|
2509 }
|
Daniel@0
|
2510 $directChildren[$parentName] = $name;
|
Daniel@0
|
2511 } else {
|
Daniel@0
|
2512 $topMostBundles[$name] = $bundle;
|
Daniel@0
|
2513 }
|
Daniel@0
|
2514 }
|
Daniel@0
|
2515 if (!empty($directChildren) && count($diff = array_diff_key($directChildren, $this->bundles))) {
|
Daniel@0
|
2516 $diff = array_keys($diff);
|
Daniel@0
|
2517 throw new \LogicException(sprintf('Bundle "%s" extends bundle "%s", which is not registered.', $directChildren[$diff[0]], $diff[0]));
|
Daniel@0
|
2518 }
|
Daniel@0
|
2519 $this->bundleMap = array();
|
Daniel@0
|
2520 foreach ($topMostBundles as $name => $bundle) {
|
Daniel@0
|
2521 $bundleMap = array($bundle);
|
Daniel@0
|
2522 $hierarchy = array($name);
|
Daniel@0
|
2523 while (isset($directChildren[$name])) {
|
Daniel@0
|
2524 $name = $directChildren[$name];
|
Daniel@0
|
2525 array_unshift($bundleMap, $this->bundles[$name]);
|
Daniel@0
|
2526 $hierarchy[] = $name;
|
Daniel@0
|
2527 }
|
Daniel@0
|
2528 foreach ($hierarchy as $bundle) {
|
Daniel@0
|
2529 $this->bundleMap[$bundle] = $bundleMap;
|
Daniel@0
|
2530 array_pop($bundleMap);
|
Daniel@0
|
2531 }
|
Daniel@0
|
2532 }
|
Daniel@0
|
2533 }
|
Daniel@0
|
2534 protected function getContainerClass()
|
Daniel@0
|
2535 {
|
Daniel@0
|
2536 return $this->name.ucfirst($this->environment).($this->debug ?'Debug':'').'ProjectContainer';
|
Daniel@0
|
2537 }
|
Daniel@0
|
2538 protected function getContainerBaseClass()
|
Daniel@0
|
2539 {
|
Daniel@0
|
2540 return'Container';
|
Daniel@0
|
2541 }
|
Daniel@0
|
2542 protected function initializeContainer()
|
Daniel@0
|
2543 {
|
Daniel@0
|
2544 $class = $this->getContainerClass();
|
Daniel@0
|
2545 $cache = new ConfigCache($this->getCacheDir().'/'.$class.'.php', $this->debug);
|
Daniel@0
|
2546 $fresh = true;
|
Daniel@0
|
2547 if (!$cache->isFresh()) {
|
Daniel@0
|
2548 $container = $this->buildContainer();
|
Daniel@0
|
2549 $container->compile();
|
Daniel@0
|
2550 $this->dumpContainer($cache, $container, $class, $this->getContainerBaseClass());
|
Daniel@0
|
2551 $fresh = false;
|
Daniel@0
|
2552 }
|
Daniel@0
|
2553 require_once $cache;
|
Daniel@0
|
2554 $this->container = new $class();
|
Daniel@0
|
2555 $this->container->set('kernel', $this);
|
Daniel@0
|
2556 if (!$fresh && $this->container->has('cache_warmer')) {
|
Daniel@0
|
2557 $this->container->get('cache_warmer')->warmUp($this->container->getParameter('kernel.cache_dir'));
|
Daniel@0
|
2558 }
|
Daniel@0
|
2559 }
|
Daniel@0
|
2560 protected function getKernelParameters()
|
Daniel@0
|
2561 {
|
Daniel@0
|
2562 $bundles = array();
|
Daniel@0
|
2563 foreach ($this->bundles as $name => $bundle) {
|
Daniel@0
|
2564 $bundles[$name] = get_class($bundle);
|
Daniel@0
|
2565 }
|
Daniel@0
|
2566 return array_merge(
|
Daniel@0
|
2567 array('kernel.root_dir'=> realpath($this->rootDir) ?: $this->rootDir,'kernel.environment'=> $this->environment,'kernel.debug'=> $this->debug,'kernel.name'=> $this->name,'kernel.cache_dir'=> realpath($this->getCacheDir()) ?: $this->getCacheDir(),'kernel.logs_dir'=> realpath($this->getLogDir()) ?: $this->getLogDir(),'kernel.bundles'=> $bundles,'kernel.charset'=> $this->getCharset(),'kernel.container_class'=> $this->getContainerClass(),
|
Daniel@0
|
2568 ),
|
Daniel@0
|
2569 $this->getEnvParameters()
|
Daniel@0
|
2570 );
|
Daniel@0
|
2571 }
|
Daniel@0
|
2572 protected function getEnvParameters()
|
Daniel@0
|
2573 {
|
Daniel@0
|
2574 $parameters = array();
|
Daniel@0
|
2575 foreach ($_SERVER as $key => $value) {
|
Daniel@0
|
2576 if (0 === strpos($key,'SYMFONY__')) {
|
Daniel@0
|
2577 $parameters[strtolower(str_replace('__','.', substr($key, 9)))] = $value;
|
Daniel@0
|
2578 }
|
Daniel@0
|
2579 }
|
Daniel@0
|
2580 return $parameters;
|
Daniel@0
|
2581 }
|
Daniel@0
|
2582 protected function buildContainer()
|
Daniel@0
|
2583 {
|
Daniel@0
|
2584 foreach (array('cache'=> $this->getCacheDir(),'logs'=> $this->getLogDir()) as $name => $dir) {
|
Daniel@0
|
2585 if (!is_dir($dir)) {
|
Daniel@0
|
2586 if (false === @mkdir($dir, 0777, true)) {
|
Daniel@0
|
2587 throw new \RuntimeException(sprintf("Unable to create the %s directory (%s)\n", $name, $dir));
|
Daniel@0
|
2588 }
|
Daniel@0
|
2589 } elseif (!is_writable($dir)) {
|
Daniel@0
|
2590 throw new \RuntimeException(sprintf("Unable to write in the %s directory (%s)\n", $name, $dir));
|
Daniel@0
|
2591 }
|
Daniel@0
|
2592 }
|
Daniel@0
|
2593 $container = $this->getContainerBuilder();
|
Daniel@0
|
2594 $container->addObjectResource($this);
|
Daniel@0
|
2595 $this->prepareContainer($container);
|
Daniel@0
|
2596 if (null !== $cont = $this->registerContainerConfiguration($this->getContainerLoader($container))) {
|
Daniel@0
|
2597 $container->merge($cont);
|
Daniel@0
|
2598 }
|
Daniel@0
|
2599 $container->addCompilerPass(new AddClassesToCachePass($this));
|
Daniel@0
|
2600 $container->addResource(new EnvParametersResource('SYMFONY__'));
|
Daniel@0
|
2601 return $container;
|
Daniel@0
|
2602 }
|
Daniel@0
|
2603 protected function prepareContainer(ContainerBuilder $container)
|
Daniel@0
|
2604 {
|
Daniel@0
|
2605 $extensions = array();
|
Daniel@0
|
2606 foreach ($this->bundles as $bundle) {
|
Daniel@0
|
2607 if ($extension = $bundle->getContainerExtension()) {
|
Daniel@0
|
2608 $container->registerExtension($extension);
|
Daniel@0
|
2609 $extensions[] = $extension->getAlias();
|
Daniel@0
|
2610 }
|
Daniel@0
|
2611 if ($this->debug) {
|
Daniel@0
|
2612 $container->addObjectResource($bundle);
|
Daniel@0
|
2613 }
|
Daniel@0
|
2614 }
|
Daniel@0
|
2615 foreach ($this->bundles as $bundle) {
|
Daniel@0
|
2616 $bundle->build($container);
|
Daniel@0
|
2617 }
|
Daniel@0
|
2618 $container->getCompilerPassConfig()->setMergePass(new MergeExtensionConfigurationPass($extensions));
|
Daniel@0
|
2619 }
|
Daniel@0
|
2620 protected function getContainerBuilder()
|
Daniel@0
|
2621 {
|
Daniel@0
|
2622 $container = new ContainerBuilder(new ParameterBag($this->getKernelParameters()));
|
Daniel@0
|
2623 if (class_exists('ProxyManager\Configuration')) {
|
Daniel@0
|
2624 $container->setProxyInstantiator(new RuntimeInstantiator());
|
Daniel@0
|
2625 }
|
Daniel@0
|
2626 return $container;
|
Daniel@0
|
2627 }
|
Daniel@0
|
2628 protected function dumpContainer(ConfigCache $cache, ContainerBuilder $container, $class, $baseClass)
|
Daniel@0
|
2629 {
|
Daniel@0
|
2630 $dumper = new PhpDumper($container);
|
Daniel@0
|
2631 if (class_exists('ProxyManager\Configuration')) {
|
Daniel@0
|
2632 $dumper->setProxyDumper(new ProxyDumper());
|
Daniel@0
|
2633 }
|
Daniel@0
|
2634 $content = $dumper->dump(array('class'=> $class,'base_class'=> $baseClass,'file'=> (string) $cache));
|
Daniel@0
|
2635 if (!$this->debug) {
|
Daniel@0
|
2636 $content = static::stripComments($content);
|
Daniel@0
|
2637 }
|
Daniel@0
|
2638 $cache->write($content, $container->getResources());
|
Daniel@0
|
2639 }
|
Daniel@0
|
2640 protected function getContainerLoader(ContainerInterface $container)
|
Daniel@0
|
2641 {
|
Daniel@0
|
2642 $locator = new FileLocator($this);
|
Daniel@0
|
2643 $resolver = new LoaderResolver(array(
|
Daniel@0
|
2644 new XmlFileLoader($container, $locator),
|
Daniel@0
|
2645 new YamlFileLoader($container, $locator),
|
Daniel@0
|
2646 new IniFileLoader($container, $locator),
|
Daniel@0
|
2647 new PhpFileLoader($container, $locator),
|
Daniel@0
|
2648 new ClosureLoader($container),
|
Daniel@0
|
2649 ));
|
Daniel@0
|
2650 return new DelegatingLoader($resolver);
|
Daniel@0
|
2651 }
|
Daniel@0
|
2652 public static function stripComments($source)
|
Daniel@0
|
2653 {
|
Daniel@0
|
2654 if (!function_exists('token_get_all')) {
|
Daniel@0
|
2655 return $source;
|
Daniel@0
|
2656 }
|
Daniel@0
|
2657 $rawChunk ='';
|
Daniel@0
|
2658 $output ='';
|
Daniel@0
|
2659 $tokens = token_get_all($source);
|
Daniel@0
|
2660 $ignoreSpace = false;
|
Daniel@0
|
2661 for (reset($tokens); false !== $token = current($tokens); next($tokens)) {
|
Daniel@0
|
2662 if (is_string($token)) {
|
Daniel@0
|
2663 $rawChunk .= $token;
|
Daniel@0
|
2664 } elseif (T_START_HEREDOC === $token[0]) {
|
Daniel@0
|
2665 $output .= $rawChunk.$token[1];
|
Daniel@0
|
2666 do {
|
Daniel@0
|
2667 $token = next($tokens);
|
Daniel@0
|
2668 $output .= $token[1];
|
Daniel@0
|
2669 } while ($token[0] !== T_END_HEREDOC);
|
Daniel@0
|
2670 $rawChunk ='';
|
Daniel@0
|
2671 } elseif (T_WHITESPACE === $token[0]) {
|
Daniel@0
|
2672 if ($ignoreSpace) {
|
Daniel@0
|
2673 $ignoreSpace = false;
|
Daniel@0
|
2674 continue;
|
Daniel@0
|
2675 }
|
Daniel@0
|
2676 $rawChunk .= preg_replace(array('/\n{2,}/S'),"\n", $token[1]);
|
Daniel@0
|
2677 } elseif (in_array($token[0], array(T_COMMENT, T_DOC_COMMENT))) {
|
Daniel@0
|
2678 $ignoreSpace = true;
|
Daniel@0
|
2679 } else {
|
Daniel@0
|
2680 $rawChunk .= $token[1];
|
Daniel@0
|
2681 if (T_OPEN_TAG === $token[0]) {
|
Daniel@0
|
2682 $ignoreSpace = true;
|
Daniel@0
|
2683 }
|
Daniel@0
|
2684 }
|
Daniel@0
|
2685 }
|
Daniel@0
|
2686 $output .= $rawChunk;
|
Daniel@0
|
2687 return $output;
|
Daniel@0
|
2688 }
|
Daniel@0
|
2689 public function serialize()
|
Daniel@0
|
2690 {
|
Daniel@0
|
2691 return serialize(array($this->environment, $this->debug));
|
Daniel@0
|
2692 }
|
Daniel@0
|
2693 public function unserialize($data)
|
Daniel@0
|
2694 {
|
Daniel@0
|
2695 list($environment, $debug) = unserialize($data);
|
Daniel@0
|
2696 $this->__construct($environment, $debug);
|
Daniel@0
|
2697 }
|
Daniel@0
|
2698 }
|
Daniel@0
|
2699 }
|
Daniel@0
|
2700 namespace Symfony\Component\ClassLoader
|
Daniel@0
|
2701 {
|
Daniel@0
|
2702 class ApcClassLoader
|
Daniel@0
|
2703 {
|
Daniel@0
|
2704 private $prefix;
|
Daniel@0
|
2705 protected $decorated;
|
Daniel@0
|
2706 public function __construct($prefix, $decorated)
|
Daniel@0
|
2707 {
|
Daniel@0
|
2708 if (!extension_loaded('apc')) {
|
Daniel@0
|
2709 throw new \RuntimeException('Unable to use ApcClassLoader as APC is not enabled.');
|
Daniel@0
|
2710 }
|
Daniel@0
|
2711 if (!method_exists($decorated,'findFile')) {
|
Daniel@0
|
2712 throw new \InvalidArgumentException('The class finder must implement a "findFile" method.');
|
Daniel@0
|
2713 }
|
Daniel@0
|
2714 $this->prefix = $prefix;
|
Daniel@0
|
2715 $this->decorated = $decorated;
|
Daniel@0
|
2716 }
|
Daniel@0
|
2717 public function register($prepend = false)
|
Daniel@0
|
2718 {
|
Daniel@0
|
2719 spl_autoload_register(array($this,'loadClass'), true, $prepend);
|
Daniel@0
|
2720 }
|
Daniel@0
|
2721 public function unregister()
|
Daniel@0
|
2722 {
|
Daniel@0
|
2723 spl_autoload_unregister(array($this,'loadClass'));
|
Daniel@0
|
2724 }
|
Daniel@0
|
2725 public function loadClass($class)
|
Daniel@0
|
2726 {
|
Daniel@0
|
2727 if ($file = $this->findFile($class)) {
|
Daniel@0
|
2728 require $file;
|
Daniel@0
|
2729 return true;
|
Daniel@0
|
2730 }
|
Daniel@0
|
2731 }
|
Daniel@0
|
2732 public function findFile($class)
|
Daniel@0
|
2733 {
|
Daniel@0
|
2734 if (false === $file = apc_fetch($this->prefix.$class)) {
|
Daniel@0
|
2735 apc_store($this->prefix.$class, $file = $this->decorated->findFile($class));
|
Daniel@0
|
2736 }
|
Daniel@0
|
2737 return $file;
|
Daniel@0
|
2738 }
|
Daniel@0
|
2739 public function __call($method, $args)
|
Daniel@0
|
2740 {
|
Daniel@0
|
2741 return call_user_func_array(array($this->decorated, $method), $args);
|
Daniel@0
|
2742 }
|
Daniel@0
|
2743 }
|
Daniel@0
|
2744 }
|
Daniel@0
|
2745 namespace Symfony\Component\HttpKernel\Bundle
|
Daniel@0
|
2746 {
|
Daniel@0
|
2747 use Symfony\Component\DependencyInjection\ContainerAwareInterface;
|
Daniel@0
|
2748 use Symfony\Component\DependencyInjection\ContainerBuilder;
|
Daniel@0
|
2749 use Symfony\Component\DependencyInjection\Extension\ExtensionInterface;
|
Daniel@0
|
2750 interface BundleInterface extends ContainerAwareInterface
|
Daniel@0
|
2751 {
|
Daniel@0
|
2752 public function boot();
|
Daniel@0
|
2753 public function shutdown();
|
Daniel@0
|
2754 public function build(ContainerBuilder $container);
|
Daniel@0
|
2755 public function getContainerExtension();
|
Daniel@0
|
2756 public function getParent();
|
Daniel@0
|
2757 public function getName();
|
Daniel@0
|
2758 public function getNamespace();
|
Daniel@0
|
2759 public function getPath();
|
Daniel@0
|
2760 }
|
Daniel@0
|
2761 }
|
Daniel@0
|
2762 namespace Symfony\Component\DependencyInjection
|
Daniel@0
|
2763 {
|
Daniel@0
|
2764 abstract class ContainerAware implements ContainerAwareInterface
|
Daniel@0
|
2765 {
|
Daniel@0
|
2766 protected $container;
|
Daniel@0
|
2767 public function setContainer(ContainerInterface $container = null)
|
Daniel@0
|
2768 {
|
Daniel@0
|
2769 $this->container = $container;
|
Daniel@0
|
2770 }
|
Daniel@0
|
2771 }
|
Daniel@0
|
2772 }
|
Daniel@0
|
2773 namespace Symfony\Component\HttpKernel\Bundle
|
Daniel@0
|
2774 {
|
Daniel@0
|
2775 use Symfony\Component\DependencyInjection\ContainerAware;
|
Daniel@0
|
2776 use Symfony\Component\DependencyInjection\ContainerBuilder;
|
Daniel@0
|
2777 use Symfony\Component\DependencyInjection\Container;
|
Daniel@0
|
2778 use Symfony\Component\Console\Application;
|
Daniel@0
|
2779 use Symfony\Component\Finder\Finder;
|
Daniel@0
|
2780 use Symfony\Component\DependencyInjection\Extension\ExtensionInterface;
|
Daniel@0
|
2781 abstract class Bundle extends ContainerAware implements BundleInterface
|
Daniel@0
|
2782 {
|
Daniel@0
|
2783 protected $name;
|
Daniel@0
|
2784 protected $extension;
|
Daniel@0
|
2785 protected $path;
|
Daniel@0
|
2786 public function boot()
|
Daniel@0
|
2787 {
|
Daniel@0
|
2788 }
|
Daniel@0
|
2789 public function shutdown()
|
Daniel@0
|
2790 {
|
Daniel@0
|
2791 }
|
Daniel@0
|
2792 public function build(ContainerBuilder $container)
|
Daniel@0
|
2793 {
|
Daniel@0
|
2794 }
|
Daniel@0
|
2795 public function getContainerExtension()
|
Daniel@0
|
2796 {
|
Daniel@0
|
2797 if (null === $this->extension) {
|
Daniel@0
|
2798 $basename = preg_replace('/Bundle$/','', $this->getName());
|
Daniel@0
|
2799 $class = $this->getNamespace().'\\DependencyInjection\\'.$basename.'Extension';
|
Daniel@0
|
2800 if (class_exists($class)) {
|
Daniel@0
|
2801 $extension = new $class();
|
Daniel@0
|
2802 $expectedAlias = Container::underscore($basename);
|
Daniel@0
|
2803 if ($expectedAlias != $extension->getAlias()) {
|
Daniel@0
|
2804 throw new \LogicException(sprintf('The extension alias for the default extension of a '.'bundle must be the underscored version of the '.'bundle name ("%s" instead of "%s")',
|
Daniel@0
|
2805 $expectedAlias, $extension->getAlias()
|
Daniel@0
|
2806 ));
|
Daniel@0
|
2807 }
|
Daniel@0
|
2808 $this->extension = $extension;
|
Daniel@0
|
2809 } else {
|
Daniel@0
|
2810 $this->extension = false;
|
Daniel@0
|
2811 }
|
Daniel@0
|
2812 }
|
Daniel@0
|
2813 if ($this->extension) {
|
Daniel@0
|
2814 return $this->extension;
|
Daniel@0
|
2815 }
|
Daniel@0
|
2816 }
|
Daniel@0
|
2817 public function getNamespace()
|
Daniel@0
|
2818 {
|
Daniel@0
|
2819 $class = get_class($this);
|
Daniel@0
|
2820 return substr($class, 0, strrpos($class,'\\'));
|
Daniel@0
|
2821 }
|
Daniel@0
|
2822 public function getPath()
|
Daniel@0
|
2823 {
|
Daniel@0
|
2824 if (null === $this->path) {
|
Daniel@0
|
2825 $reflected = new \ReflectionObject($this);
|
Daniel@0
|
2826 $this->path = dirname($reflected->getFileName());
|
Daniel@0
|
2827 }
|
Daniel@0
|
2828 return $this->path;
|
Daniel@0
|
2829 }
|
Daniel@0
|
2830 public function getParent()
|
Daniel@0
|
2831 {
|
Daniel@0
|
2832 }
|
Daniel@0
|
2833 final public function getName()
|
Daniel@0
|
2834 {
|
Daniel@0
|
2835 if (null !== $this->name) {
|
Daniel@0
|
2836 return $this->name;
|
Daniel@0
|
2837 }
|
Daniel@0
|
2838 $name = get_class($this);
|
Daniel@0
|
2839 $pos = strrpos($name,'\\');
|
Daniel@0
|
2840 return $this->name = false === $pos ? $name : substr($name, $pos + 1);
|
Daniel@0
|
2841 }
|
Daniel@0
|
2842 public function registerCommands(Application $application)
|
Daniel@0
|
2843 {
|
Daniel@0
|
2844 if (!is_dir($dir = $this->getPath().'/Command')) {
|
Daniel@0
|
2845 return;
|
Daniel@0
|
2846 }
|
Daniel@0
|
2847 $finder = new Finder();
|
Daniel@0
|
2848 $finder->files()->name('*Command.php')->in($dir);
|
Daniel@0
|
2849 $prefix = $this->getNamespace().'\\Command';
|
Daniel@0
|
2850 foreach ($finder as $file) {
|
Daniel@0
|
2851 $ns = $prefix;
|
Daniel@0
|
2852 if ($relativePath = $file->getRelativePath()) {
|
Daniel@0
|
2853 $ns .='\\'.strtr($relativePath,'/','\\');
|
Daniel@0
|
2854 }
|
Daniel@0
|
2855 $class = $ns.'\\'.$file->getBasename('.php');
|
Daniel@0
|
2856 if ($this->container) {
|
Daniel@0
|
2857 $alias ='console.command.'.strtolower(str_replace('\\','_', $class));
|
Daniel@0
|
2858 if ($this->container->has($alias)) {
|
Daniel@0
|
2859 continue;
|
Daniel@0
|
2860 }
|
Daniel@0
|
2861 }
|
Daniel@0
|
2862 $r = new \ReflectionClass($class);
|
Daniel@0
|
2863 if ($r->isSubclassOf('Symfony\\Component\\Console\\Command\\Command') && !$r->isAbstract() && !$r->getConstructor()->getNumberOfRequiredParameters()) {
|
Daniel@0
|
2864 $application->add($r->newInstance());
|
Daniel@0
|
2865 }
|
Daniel@0
|
2866 }
|
Daniel@0
|
2867 }
|
Daniel@0
|
2868 }
|
Daniel@0
|
2869 }
|
Daniel@0
|
2870 namespace Symfony\Component\Config
|
Daniel@0
|
2871 {
|
Daniel@0
|
2872 use Symfony\Component\Config\Resource\ResourceInterface;
|
Daniel@0
|
2873 use Symfony\Component\Filesystem\Exception\IOException;
|
Daniel@0
|
2874 use Symfony\Component\Filesystem\Filesystem;
|
Daniel@0
|
2875 class ConfigCache
|
Daniel@0
|
2876 {
|
Daniel@0
|
2877 private $debug;
|
Daniel@0
|
2878 private $file;
|
Daniel@0
|
2879 public function __construct($file, $debug)
|
Daniel@0
|
2880 {
|
Daniel@0
|
2881 $this->file = $file;
|
Daniel@0
|
2882 $this->debug = (bool) $debug;
|
Daniel@0
|
2883 }
|
Daniel@0
|
2884 public function __toString()
|
Daniel@0
|
2885 {
|
Daniel@0
|
2886 return $this->file;
|
Daniel@0
|
2887 }
|
Daniel@0
|
2888 public function isFresh()
|
Daniel@0
|
2889 {
|
Daniel@0
|
2890 if (!is_file($this->file)) {
|
Daniel@0
|
2891 return false;
|
Daniel@0
|
2892 }
|
Daniel@0
|
2893 if (!$this->debug) {
|
Daniel@0
|
2894 return true;
|
Daniel@0
|
2895 }
|
Daniel@0
|
2896 $metadata = $this->getMetaFile();
|
Daniel@0
|
2897 if (!is_file($metadata)) {
|
Daniel@0
|
2898 return false;
|
Daniel@0
|
2899 }
|
Daniel@0
|
2900 $time = filemtime($this->file);
|
Daniel@0
|
2901 $meta = unserialize(file_get_contents($metadata));
|
Daniel@0
|
2902 foreach ($meta as $resource) {
|
Daniel@0
|
2903 if (!$resource->isFresh($time)) {
|
Daniel@0
|
2904 return false;
|
Daniel@0
|
2905 }
|
Daniel@0
|
2906 }
|
Daniel@0
|
2907 return true;
|
Daniel@0
|
2908 }
|
Daniel@0
|
2909 public function write($content, array $metadata = null)
|
Daniel@0
|
2910 {
|
Daniel@0
|
2911 $mode = 0666;
|
Daniel@0
|
2912 $umask = umask();
|
Daniel@0
|
2913 $filesystem = new Filesystem();
|
Daniel@0
|
2914 $filesystem->dumpFile($this->file, $content, null);
|
Daniel@0
|
2915 try {
|
Daniel@0
|
2916 $filesystem->chmod($this->file, $mode, $umask);
|
Daniel@0
|
2917 } catch (IOException $e) {
|
Daniel@0
|
2918 }
|
Daniel@0
|
2919 if (null !== $metadata && true === $this->debug) {
|
Daniel@0
|
2920 $filesystem->dumpFile($this->getMetaFile(), serialize($metadata), null);
|
Daniel@0
|
2921 try {
|
Daniel@0
|
2922 $filesystem->chmod($this->getMetaFile(), $mode, $umask);
|
Daniel@0
|
2923 } catch (IOException $e) {
|
Daniel@0
|
2924 }
|
Daniel@0
|
2925 }
|
Daniel@0
|
2926 }
|
Daniel@0
|
2927 private function getMetaFile()
|
Daniel@0
|
2928 {
|
Daniel@0
|
2929 return $this->file.'.meta';
|
Daniel@0
|
2930 }
|
Daniel@0
|
2931 }
|
Daniel@0
|
2932 }
|
Daniel@0
|
2933 namespace Symfony\Component\HttpKernel
|
Daniel@0
|
2934 {
|
Daniel@0
|
2935 use Symfony\Component\HttpKernel\Controller\ControllerResolverInterface;
|
Daniel@0
|
2936 use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
|
Daniel@0
|
2937 use Symfony\Component\HttpKernel\Exception\HttpExceptionInterface;
|
Daniel@0
|
2938 use Symfony\Component\HttpKernel\Event\FilterControllerEvent;
|
Daniel@0
|
2939 use Symfony\Component\HttpKernel\Event\FilterResponseEvent;
|
Daniel@0
|
2940 use Symfony\Component\HttpKernel\Event\FinishRequestEvent;
|
Daniel@0
|
2941 use Symfony\Component\HttpKernel\Event\GetResponseEvent;
|
Daniel@0
|
2942 use Symfony\Component\HttpKernel\Event\GetResponseForControllerResultEvent;
|
Daniel@0
|
2943 use Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent;
|
Daniel@0
|
2944 use Symfony\Component\HttpKernel\Event\PostResponseEvent;
|
Daniel@0
|
2945 use Symfony\Component\HttpFoundation\Request;
|
Daniel@0
|
2946 use Symfony\Component\HttpFoundation\RequestStack;
|
Daniel@0
|
2947 use Symfony\Component\HttpFoundation\Response;
|
Daniel@0
|
2948 use Symfony\Component\EventDispatcher\EventDispatcherInterface;
|
Daniel@0
|
2949 class HttpKernel implements HttpKernelInterface, TerminableInterface
|
Daniel@0
|
2950 {
|
Daniel@0
|
2951 protected $dispatcher;
|
Daniel@0
|
2952 protected $resolver;
|
Daniel@0
|
2953 protected $requestStack;
|
Daniel@0
|
2954 public function __construct(EventDispatcherInterface $dispatcher, ControllerResolverInterface $resolver, RequestStack $requestStack = null)
|
Daniel@0
|
2955 {
|
Daniel@0
|
2956 $this->dispatcher = $dispatcher;
|
Daniel@0
|
2957 $this->resolver = $resolver;
|
Daniel@0
|
2958 $this->requestStack = $requestStack ?: new RequestStack();
|
Daniel@0
|
2959 }
|
Daniel@0
|
2960 public function handle(Request $request, $type = HttpKernelInterface::MASTER_REQUEST, $catch = true)
|
Daniel@0
|
2961 {
|
Daniel@0
|
2962 try {
|
Daniel@0
|
2963 return $this->handleRaw($request, $type);
|
Daniel@0
|
2964 } catch (\Exception $e) {
|
Daniel@0
|
2965 if (false === $catch) {
|
Daniel@0
|
2966 $this->finishRequest($request, $type);
|
Daniel@0
|
2967 throw $e;
|
Daniel@0
|
2968 }
|
Daniel@0
|
2969 return $this->handleException($e, $request, $type);
|
Daniel@0
|
2970 }
|
Daniel@0
|
2971 }
|
Daniel@0
|
2972 public function terminate(Request $request, Response $response)
|
Daniel@0
|
2973 {
|
Daniel@0
|
2974 $this->dispatcher->dispatch(KernelEvents::TERMINATE, new PostResponseEvent($this, $request, $response));
|
Daniel@0
|
2975 }
|
Daniel@0
|
2976 public function terminateWithException(\Exception $exception)
|
Daniel@0
|
2977 {
|
Daniel@0
|
2978 if (!$request = $this->requestStack->getMasterRequest()) {
|
Daniel@0
|
2979 throw new \LogicException('Request stack is empty', 0, $exception);
|
Daniel@0
|
2980 }
|
Daniel@0
|
2981 $response = $this->handleException($exception, $request, self::MASTER_REQUEST);
|
Daniel@0
|
2982 $response->sendHeaders();
|
Daniel@0
|
2983 $response->sendContent();
|
Daniel@0
|
2984 $this->terminate($request, $response);
|
Daniel@0
|
2985 }
|
Daniel@0
|
2986 private function handleRaw(Request $request, $type = self::MASTER_REQUEST)
|
Daniel@0
|
2987 {
|
Daniel@0
|
2988 $this->requestStack->push($request);
|
Daniel@0
|
2989 $event = new GetResponseEvent($this, $request, $type);
|
Daniel@0
|
2990 $this->dispatcher->dispatch(KernelEvents::REQUEST, $event);
|
Daniel@0
|
2991 if ($event->hasResponse()) {
|
Daniel@0
|
2992 return $this->filterResponse($event->getResponse(), $request, $type);
|
Daniel@0
|
2993 }
|
Daniel@0
|
2994 if (false === $controller = $this->resolver->getController($request)) {
|
Daniel@0
|
2995 throw new NotFoundHttpException(sprintf('Unable to find the controller for path "%s". Maybe you forgot to add the matching route in your routing configuration?', $request->getPathInfo()));
|
Daniel@0
|
2996 }
|
Daniel@0
|
2997 $event = new FilterControllerEvent($this, $controller, $request, $type);
|
Daniel@0
|
2998 $this->dispatcher->dispatch(KernelEvents::CONTROLLER, $event);
|
Daniel@0
|
2999 $controller = $event->getController();
|
Daniel@0
|
3000 $arguments = $this->resolver->getArguments($request, $controller);
|
Daniel@0
|
3001 $response = call_user_func_array($controller, $arguments);
|
Daniel@0
|
3002 if (!$response instanceof Response) {
|
Daniel@0
|
3003 $event = new GetResponseForControllerResultEvent($this, $request, $type, $response);
|
Daniel@0
|
3004 $this->dispatcher->dispatch(KernelEvents::VIEW, $event);
|
Daniel@0
|
3005 if ($event->hasResponse()) {
|
Daniel@0
|
3006 $response = $event->getResponse();
|
Daniel@0
|
3007 }
|
Daniel@0
|
3008 if (!$response instanceof Response) {
|
Daniel@0
|
3009 $msg = sprintf('The controller must return a response (%s given).', $this->varToString($response));
|
Daniel@0
|
3010 if (null === $response) {
|
Daniel@0
|
3011 $msg .=' Did you forget to add a return statement somewhere in your controller?';
|
Daniel@0
|
3012 }
|
Daniel@0
|
3013 throw new \LogicException($msg);
|
Daniel@0
|
3014 }
|
Daniel@0
|
3015 }
|
Daniel@0
|
3016 return $this->filterResponse($response, $request, $type);
|
Daniel@0
|
3017 }
|
Daniel@0
|
3018 private function filterResponse(Response $response, Request $request, $type)
|
Daniel@0
|
3019 {
|
Daniel@0
|
3020 $event = new FilterResponseEvent($this, $request, $type, $response);
|
Daniel@0
|
3021 $this->dispatcher->dispatch(KernelEvents::RESPONSE, $event);
|
Daniel@0
|
3022 $this->finishRequest($request, $type);
|
Daniel@0
|
3023 return $event->getResponse();
|
Daniel@0
|
3024 }
|
Daniel@0
|
3025 private function finishRequest(Request $request, $type)
|
Daniel@0
|
3026 {
|
Daniel@0
|
3027 $this->dispatcher->dispatch(KernelEvents::FINISH_REQUEST, new FinishRequestEvent($this, $request, $type));
|
Daniel@0
|
3028 $this->requestStack->pop();
|
Daniel@0
|
3029 }
|
Daniel@0
|
3030 private function handleException(\Exception $e, $request, $type)
|
Daniel@0
|
3031 {
|
Daniel@0
|
3032 $event = new GetResponseForExceptionEvent($this, $request, $type, $e);
|
Daniel@0
|
3033 $this->dispatcher->dispatch(KernelEvents::EXCEPTION, $event);
|
Daniel@0
|
3034 $e = $event->getException();
|
Daniel@0
|
3035 if (!$event->hasResponse()) {
|
Daniel@0
|
3036 $this->finishRequest($request, $type);
|
Daniel@0
|
3037 throw $e;
|
Daniel@0
|
3038 }
|
Daniel@0
|
3039 $response = $event->getResponse();
|
Daniel@0
|
3040 if ($response->headers->has('X-Status-Code')) {
|
Daniel@0
|
3041 $response->setStatusCode($response->headers->get('X-Status-Code'));
|
Daniel@0
|
3042 $response->headers->remove('X-Status-Code');
|
Daniel@0
|
3043 } elseif (!$response->isClientError() && !$response->isServerError() && !$response->isRedirect()) {
|
Daniel@0
|
3044 if ($e instanceof HttpExceptionInterface) {
|
Daniel@0
|
3045 $response->setStatusCode($e->getStatusCode());
|
Daniel@0
|
3046 $response->headers->add($e->getHeaders());
|
Daniel@0
|
3047 } else {
|
Daniel@0
|
3048 $response->setStatusCode(500);
|
Daniel@0
|
3049 }
|
Daniel@0
|
3050 }
|
Daniel@0
|
3051 try {
|
Daniel@0
|
3052 return $this->filterResponse($response, $request, $type);
|
Daniel@0
|
3053 } catch (\Exception $e) {
|
Daniel@0
|
3054 return $response;
|
Daniel@0
|
3055 }
|
Daniel@0
|
3056 }
|
Daniel@0
|
3057 private function varToString($var)
|
Daniel@0
|
3058 {
|
Daniel@0
|
3059 if (is_object($var)) {
|
Daniel@0
|
3060 return sprintf('Object(%s)', get_class($var));
|
Daniel@0
|
3061 }
|
Daniel@0
|
3062 if (is_array($var)) {
|
Daniel@0
|
3063 $a = array();
|
Daniel@0
|
3064 foreach ($var as $k => $v) {
|
Daniel@0
|
3065 $a[] = sprintf('%s => %s', $k, $this->varToString($v));
|
Daniel@0
|
3066 }
|
Daniel@0
|
3067 return sprintf("Array(%s)", implode(', ', $a));
|
Daniel@0
|
3068 }
|
Daniel@0
|
3069 if (is_resource($var)) {
|
Daniel@0
|
3070 return sprintf('Resource(%s)', get_resource_type($var));
|
Daniel@0
|
3071 }
|
Daniel@0
|
3072 if (null === $var) {
|
Daniel@0
|
3073 return'null';
|
Daniel@0
|
3074 }
|
Daniel@0
|
3075 if (false === $var) {
|
Daniel@0
|
3076 return'false';
|
Daniel@0
|
3077 }
|
Daniel@0
|
3078 if (true === $var) {
|
Daniel@0
|
3079 return'true';
|
Daniel@0
|
3080 }
|
Daniel@0
|
3081 return (string) $var;
|
Daniel@0
|
3082 }
|
Daniel@0
|
3083 }
|
Daniel@0
|
3084 }
|
Daniel@0
|
3085 namespace Symfony\Component\HttpKernel\DependencyInjection
|
Daniel@0
|
3086 {
|
Daniel@0
|
3087 use Symfony\Component\HttpFoundation\Request;
|
Daniel@0
|
3088 use Symfony\Component\HttpFoundation\RequestStack;
|
Daniel@0
|
3089 use Symfony\Component\HttpKernel\HttpKernelInterface;
|
Daniel@0
|
3090 use Symfony\Component\HttpKernel\HttpKernel;
|
Daniel@0
|
3091 use Symfony\Component\HttpKernel\Controller\ControllerResolverInterface;
|
Daniel@0
|
3092 use Symfony\Component\EventDispatcher\EventDispatcherInterface;
|
Daniel@0
|
3093 use Symfony\Component\DependencyInjection\ContainerInterface;
|
Daniel@0
|
3094 use Symfony\Component\DependencyInjection\Scope;
|
Daniel@0
|
3095 class ContainerAwareHttpKernel extends HttpKernel
|
Daniel@0
|
3096 {
|
Daniel@0
|
3097 protected $container;
|
Daniel@0
|
3098 public function __construct(EventDispatcherInterface $dispatcher, ContainerInterface $container, ControllerResolverInterface $controllerResolver, RequestStack $requestStack = null)
|
Daniel@0
|
3099 {
|
Daniel@0
|
3100 parent::__construct($dispatcher, $controllerResolver, $requestStack);
|
Daniel@0
|
3101 $this->container = $container;
|
Daniel@0
|
3102 if (!$container->hasScope('request')) {
|
Daniel@0
|
3103 $container->addScope(new Scope('request'));
|
Daniel@0
|
3104 }
|
Daniel@0
|
3105 }
|
Daniel@0
|
3106 public function handle(Request $request, $type = HttpKernelInterface::MASTER_REQUEST, $catch = true)
|
Daniel@0
|
3107 {
|
Daniel@0
|
3108 $request->headers->set('X-Php-Ob-Level', ob_get_level());
|
Daniel@0
|
3109 $this->container->enterScope('request');
|
Daniel@0
|
3110 $this->container->set('request', $request,'request');
|
Daniel@0
|
3111 try {
|
Daniel@0
|
3112 $response = parent::handle($request, $type, $catch);
|
Daniel@0
|
3113 } catch (\Exception $e) {
|
Daniel@0
|
3114 $this->container->set('request', null,'request');
|
Daniel@0
|
3115 $this->container->leaveScope('request');
|
Daniel@0
|
3116 throw $e;
|
Daniel@0
|
3117 }
|
Daniel@0
|
3118 $this->container->set('request', null,'request');
|
Daniel@0
|
3119 $this->container->leaveScope('request');
|
Daniel@0
|
3120 return $response;
|
Daniel@0
|
3121 }
|
Daniel@0
|
3122 }
|
Daniel@0
|
3123 }
|
Daniel@0
|
3124
|
Daniel@0
|
3125 namespace { return $loader; }
|
Daniel@0
|
3126 |