comparison app/bootstrap.php.cache @ 0:493bcb69166c

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