diff -r 000000000000 -r 7f95f8617b0b vendor/symfony/src/Symfony/Bundle/WebProfilerBundle/Controller/ProfilerController.php --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vendor/symfony/src/Symfony/Bundle/WebProfilerBundle/Controller/ProfilerController.php Sat Sep 24 15:40:41 2011 +0200 @@ -0,0 +1,306 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Bundle\WebProfilerBundle\Controller; + +use Symfony\Component\DependencyInjection\ContainerAware; +use Symfony\Component\HttpFoundation\Response; +use Symfony\Component\HttpFoundation\RedirectResponse; +use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; + +/** + * ProfilerController. + * + * @author Fabien Potencier + */ +class ProfilerController extends ContainerAware +{ + /** + * Renders a profiler panel for the given token. + * + * @param string $token The profiler token + * + * @return Response A Response instance + */ + public function panelAction($token) + { + $profiler = $this->container->get('profiler'); + $profiler->disable(); + + $panel = $this->container->get('request')->query->get('panel', 'request'); + + if (!$profile = $profiler->loadProfile($token)) { + return $this->container->get('templating')->renderResponse('WebProfilerBundle:Profiler:notfound.html.twig', array('token' => $token)); + } + + if (!$profile->hasCollector($panel)) { + throw new NotFoundHttpException(sprintf('Panel "%s" is not available for token "%s".', $panel, $token)); + } + + return $this->container->get('templating')->renderResponse($this->getTemplateName($profiler, $panel), array( + 'token' => $token, + 'profile' => $profile, + 'collector' => $profile->getCollector($panel), + 'panel' => $panel, + 'templates' => $this->getTemplates($profiler), + )); + } + + /** + * Exports data for a given token. + * + * @param string $token The profiler token + * + * @return Response A Response instance + */ + public function exportAction($token) + { + $profiler = $this->container->get('profiler'); + $profiler->disable(); + + if (!$profile = $profiler->loadProfile($token)) { + throw new NotFoundHttpException(sprintf('Token "%s" does not exist.', $token)); + } + + return new Response($profiler->export($profile), 200, array( + 'Content-Type' => 'text/plain', + 'Content-Disposition' => 'attachment; filename= '.$token.'.txt', + )); + } + + /** + * Purges all tokens. + * + * @return Response A Response instance + */ + public function purgeAction() + { + $profiler = $this->container->get('profiler'); + $profiler->disable(); + $profiler->purge(); + + return new RedirectResponse($this->container->get('router')->generate('_profiler', array('token' => '-'))); + } + + /** + * Imports token data. + * + * @return Response A Response instance + */ + public function importAction() + { + $profiler = $this->container->get('profiler'); + $profiler->disable(); + + $file = $this->container->get('request')->files->get('file'); + if (!$file || UPLOAD_ERR_OK !== $file->getError()) { + throw new \RuntimeException('Problem uploading the data.'); + } + + if (!$profile = $profiler->import(file_get_contents($file->getPath()))) { + throw new \RuntimeException('Problem uploading the data (token already exists).'); + } + + return new RedirectResponse($this->container->get('router')->generate('_profiler', array('token' => $profile->getToken()))); + } + + /** + * Renders the Web Debug Toolbar. + * + * @param string $token The profiler token + * @param string $position The toolbar position (bottom, normal, or null -- automatically guessed) + * + * @return Response A Response instance + */ + public function toolbarAction($token, $position = null) + { + $request = $this->container->get('request'); + + if (null !== $session = $request->getSession()) { + // keep current flashes for one more request + $session->setFlashes($session->getFlashes()); + } + + if (null === $token) { + return new Response(); + } + + $profiler = $this->container->get('profiler'); + $profiler->disable(); + + if (!$profile = $profiler->loadProfile($token)) { + return new Response(); + } + + if (null === $position) { + $position = false === strpos($this->container->get('request')->headers->get('user-agent'), 'Mobile') ? 'fixed' : 'absolute'; + } + + $url = null; + try { + $url = $this->container->get('router')->generate('_profiler', array('token' => $token)); + } catch (\Exception $e) { + // the profiler is not enabled + } + + return $this->container->get('templating')->renderResponse('WebProfilerBundle:Profiler:toolbar.html.twig', array( + 'position' => $position, + 'profile' => $profile, + 'templates' => $this->getTemplates($profiler), + 'profiler_url' => $url, + 'verbose' => $this->container->get('web_profiler.debug_toolbar')->isVerbose() + )); + } + + /** + * Renders the profiler search bar. + * + * @return Response A Response instance + */ + public function searchBarAction() + { + $profiler = $this->container->get('profiler'); + $profiler->disable(); + + if (null === $session = $this->container->get('request')->getSession()) { + $ip = + $url = + $limit = + $token = null; + } else { + $ip = $session->get('_profiler_search_ip'); + $url = $session->get('_profiler_search_url'); + $limit = $session->get('_profiler_search_limit'); + $token = $session->get('_profiler_search_token'); + } + + return $this->container->get('templating')->renderResponse('WebProfilerBundle:Profiler:search.html.twig', array( + 'token' => $token, + 'ip' => $ip, + 'url' => $url, + 'limit' => $limit, + )); + } + + /** + * Search results. + * + * @param string $token The token + * @return Response A Response instance + */ + public function searchResultsAction($token) + { + $profiler = $this->container->get('profiler'); + $profiler->disable(); + + $profile = $profiler->loadProfile($token); + + $ip = $this->container->get('request')->query->get('ip'); + $url = $this->container->get('request')->query->get('url'); + $limit = $this->container->get('request')->query->get('limit'); + + return $this->container->get('templating')->renderResponse('WebProfilerBundle:Profiler:results.html.twig', array( + 'token' => $token, + 'profile' => $profile, + 'tokens' => $profiler->find($ip, $url, $limit), + 'ip' => $ip, + 'url' => $url, + 'limit' => $limit, + 'panel' => null, + )); + } + + /** + * Narrow the search bar. + * + * @return Response A Response instance + */ + public function searchAction() + { + $profiler = $this->container->get('profiler'); + $profiler->disable(); + + $request = $this->container->get('request'); + + $ip = preg_replace('/[^\d\.]/', '', $request->query->get('ip')); + $url = $request->query->get('url'); + $limit = $request->query->get('limit'); + $token = $request->query->get('token'); + + if (null !== $session = $request->getSession()) { + $session->set('_profiler_search_ip', $ip); + $session->set('_profiler_search_url', $url); + $session->set('_profiler_search_limit', $limit); + $session->set('_profiler_search_token', $token); + } + + if (!empty($token)) { + return new RedirectResponse($this->container->get('router')->generate('_profiler', array('token' => $token))); + } + + $tokens = $profiler->find($ip, $url, $limit); + + return new RedirectResponse($this->container->get('router')->generate('_profiler_search_results', array( + 'token' => $tokens ? $tokens[0]['token'] : 'empty', + 'ip' => $ip, + 'url' => $url, + 'limit' => $limit, + ))); + } + + protected function getTemplateNames($profiler) + { + $templates = array(); + foreach ($this->container->getParameter('data_collector.templates') as $id => $arguments) { + if (null === $arguments) { + continue; + } + + list($name, $template) = $arguments; + if (!$profiler->has($name)) { + continue; + } + + if ('.html.twig' === substr($template, -10)) { + $template = substr($template, 0, -10); + } + + if (!$this->container->get('templating')->exists($template.'.html.twig')) { + throw new \UnexpectedValueException(sprintf('The profiler template "%s.html.twig" for data collector "%s" does not exist.', $template, $name)); + } + + $templates[$name] = $template.'.html.twig'; + } + + return $templates; + } + + protected function getTemplateName($profiler, $panel) + { + $templates = $this->getTemplateNames($profiler); + + if (!isset($templates[$panel])) { + throw new NotFoundHttpException(sprintf('Panel "%s" is not registered.', $panel)); + } + + return $templates[$panel]; + } + + protected function getTemplates($profiler) + { + $templates = $this->getTemplateNames($profiler); + foreach ($templates as $name => $template) { + $templates[$name] = $this->container->get('twig')->loadTemplate($template); + } + + return $templates; + } +}