Beispiel #1
0
 /**
  * Renders a Controller and returns the Response content.
  *
  * Available options:
  *
  *  * path: An array of path parameters (only when the first argument is a controller)
  *  * query: An array of query parameters (only when the first argument is a controller)
  *  * ignore_errors: true to return an empty string in case of an error
  *  * alt: an alternative controller to execute in case of an error (can be a controller, a URI, or an array with the controller, the path arguments, and the query arguments)
  *
  * @param string $controller A controller name to execute (a string like BlogBundle:Post:index), or a relative URI
  * @param array  $options    An array of options
  *
  * @return string The Response content
  */
 public function render($controller, array $options = array())
 {
     $options = array_merge(array('path' => array(), 'query' => array(), 'ignore_errors' => true, 'alt' => array()), $options);
     if (!is_array($options['alt'])) {
         $options['alt'] = array($options['alt']);
     }
     $request = $this->container->getRequestService();
     // controller or URI?
     if (0 === strpos($controller, '/')) {
         $subRequest = Request::create($controller, 'get', array(), $request->cookies->all(), array(), $request->server->all());
     } else {
         $options['path']['_controller'] = $controller;
         $options['path']['_format'] = $request->getRequestFormat();
         $subRequest = $request->duplicate($options['query'], null, $options['path']);
     }
     try {
         return $this->container->getKernelService()->handle($subRequest, HttpKernelInterface::EMBEDDED_REQUEST, true);
     } catch (\Exception $e) {
         if ($options['alt']) {
             $alt = $options['alt'];
             unset($options['alt']);
             $options['path'] = isset($alt[1]) ? $alt[1] : array();
             $options['query'] = isset($alt[2]) ? $alt[2] : array();
             return $this->render($alt[0], $options);
         }
         if (!$options['ignore_errors']) {
             throw $e;
         }
     }
 }
Beispiel #2
0
 /**
  * @covers Symfony\Components\HttpKernel\Request::getFormat
  */
 public function testGetFormat()
 {
     $request = new Request();
     $this->assertNull($request->getFormat(null), '->getFormat() returns null when mime-type is null');
     $this->assertNull($request->getFormat('unexistant-mime-type'), '->getFormat() returns null when mime-type is unknown');
     $this->assertEquals('txt', $request->getFormat('text/plain'), '->getFormat() returns correct format when mime-type have one format only');
     $this->assertEquals('js', $request->getFormat('application/javascript'), '->getFormat() returns correct format when format have multiple mime-type (first)');
     $this->assertEquals('js', $request->getFormat('application/x-javascript'), '->getFormat() returns correct format when format have multiple mime-type');
     $this->assertEquals('js', $request->getFormat('text/javascript'), '->getFormat() returns correct format when format have multiple mime-type (last)');
 }
Beispiel #3
0
 public function request($method, $uri = '/', $server = array(), $cookies = array())
 {
     if (null === $this->kernel) {
         throw new \LogicException('You must call setNextResponse() before calling request().');
     }
     $this->kernel->reset();
     $this->store = new Store(sys_get_temp_dir() . '/http_cache');
     $this->cacheConfig['debug'] = true;
     $this->cache = new Cache($this->kernel, $this->store, null, $this->cacheConfig);
     $this->request = Request::create($uri, $method, array(), $cookies, array(), $server);
     $this->response = $this->cache->handle($this->request);
     $this->responses[] = $this->response;
 }
Beispiel #4
0
 /**
  * @throws \InvalidArgumentException When the exception template does not exist
  */
 public function exceptionAction(\Exception $exception, Request $originalRequest, array $logs)
 {
     $template = $this->container->getParameter('kernel.debug') ? 'exception' : 'error';
     $request = $this->getRequest();
     $format = $format = $originalRequest->getRequestFormat();
     // when using CLI, we force the format to be TXT
     if (0 === strncasecmp(PHP_SAPI, 'cli', 3)) {
         $format = 'txt';
     }
     $template = $this->container->getTemplatingService()->getLoader()->load($template, array('bundle' => 'WebBundle', 'controller' => 'Exception', 'format' => '.' . $format));
     if (false === $template) {
         throw new \InvalidArgumentException(sprintf('The exception template for format "%s" does not exist.', $format));
     }
     $code = $exception instanceof HttpException ? $exception->getCode() : 500;
     $text = Response::$statusTexts[$code];
     $formatter = new ExceptionFormatter($this->container);
     $message = null === $exception->getMessage() ? 'n/a' : $exception->getMessage();
     $name = get_class($exception);
     $traces = $formatter->getTraces($exception, 'html' === $format ? 'html' : 'text');
     $charset = $this->container->getParameter('kernel.charset');
     $errors = 0;
     foreach ($logs as $log) {
         if ('ERR' === $log['priorityName']) {
             ++$errors;
         }
     }
     $currentContent = '';
     while (false !== ($content = ob_get_clean())) {
         $currentContent .= $content;
     }
     ob_start();
     require $template;
     $content = ob_get_clean();
     $response = $this->container->getResponseService();
     $response->setStatusCode($code);
     $response->setContent($content);
     return $response;
 }
Beispiel #5
0
 public function callController(Request $request)
 {
     return new Response('Request: ' . $request->getRequestUri());
 }
Beispiel #6
0
 /**
  * Converts the BrowserKit request to a HttpKernel request.
  *
  * @param Symfony\Components\BrowserKit\Request $request A Request instance
  *
  * @return Symfony\Components\HttpKernel\Request A Request instance
  */
 protected function filterRequest(DomRequest $request)
 {
     $uri = $request->getUri();
     if (preg_match('#^https?\\://([^/]+)/(.*)$#', $uri, $matches)) {
         $uri = '/' . $matches[2];
     }
     return Request::create($uri, $request->getMethod(), $request->getParameters(), $request->getFiles(), $request->getCookies(), $request->getServer());
 }
Beispiel #7
0
 /**
  * Returns a cache key for the given Request.
  *
  * @param Symfony\Components\HttpKernel\Request $request A Request instance
  *
  * @return string A key for the given Request
  */
 public function getCacheKey(Request $request)
 {
     if (isset($this->keyCache[$request])) {
         return $this->keyCache[$request];
     }
     return $this->keyCache[$request] = 'md' . sha1($request->getUri());
 }
 /**
  * @param Symfony\Components\EventDispatcher\Event $event
  *
  * @see Symfony\Components\EventDispatcher\EventDispatcher::notifyUntil()
  */
 public function handle(Event $event)
 {
     /** @var Bundle\ServerBundle\RequestInterface $request */
     $request = $event->getSubject();
     /** @var Bundle\ServerBundle\Socket\ServerSocket $server */
     $server = $event->getParameter('server');
     /** @var Bundle\ServerBundle\Socket\ClientSocket $client */
     $client = $event->getParameter('client');
     // collect parameters
     $requestMethod = $request->getRequestMethod();
     $requestUrl = $request->getRequestUrl();
     $url = parse_url($requestUrl);
     $queryString = isset($url['path']) ? $url['path'] : null;
     // @TODO: fix script name, script filename & path_translated
     $scriptName = '/index.php';
     // GET & POST parameters
     $getParameters = array();
     parse_str($queryString, $getParameters);
     $postParameters = array();
     if ($request->getRequestMethod() == Request::METHOD_POST) {
         parse_str($request->getBody(), $postParameters);
     }
     // local & remote address:port
     list($address, $port) = explode(':', $server->getName());
     list($remoteAddress, $remotePort) = explode(':', $client->getPeerName());
     // fake _SERVER
     // @see http://php.net/manual/de/reserved.variables.server.php
     $server = array('SERVER_SIGNATURE' => sprintf('<address>Symfony/%s (ServerBundle) Server at %s Port %d</address>', Kernel::VERSION, $this->options['hostname'], $port), 'SERVER_SOFTWARE' => sprintf('Symfony/%s (ServerBundle)', Kernel::VERSION), 'SERVER_NAME' => $this->options['hostname'], 'SERVER_ADDR' => $address, 'SERVER_PORT' => $port, 'SERVER_ADMIN' => $this->options['admin'], 'GATEWAY_INTERFACE' => 'CGI/1.1', 'SERVER_PROTOCOL' => 'HTTP/' . $request->getHttpVersion(), 'REQUEST_METHOD' => $requestMethod, 'REMOTE_ADDR' => $remoteAddress, 'REMOTE_PORT' => $remotePort, 'DOCUMENT_ROOT' => $this->options['document_root'], 'QUERY_STRING' => $queryString, 'REQUEST_URI' => $requestUrl, 'REQUEST_TIME' => $client->getAccepted(), 'PHP_SELF' => $url['path'], 'SCRIPT_NAME' => $scriptName, 'SCRIPT_FILENAME' => $scriptFilename = $this->options['document_root'] . $scriptName, 'PATH_INFO' => str_replace($scriptName, '', $url['path']), 'PATH_TRANSLATED' => $scriptFilename);
     // @TODO: PATH
     // @TODO: AUTH > AUTH_TYPE, REMOTE_USER, REMOTE_IDENT
     // @TODO: POST, PUT > CONTENT_TYPE, CONTENT_LENGTH
     // extend _SERVER
     if ($request->getRequestMethod() == Request::METHOD_GET) {
         $server['argv'] = $queryString;
         $server['argc'] = count($getParameters);
     }
     if ($this->options['hostname_lookups']) {
         $server['REMOTE_HOST'] = gethostbyaddr($remoteAddress);
     }
     if ($request->hasHeader('Host')) {
         $server['HTTP_HOST'] = $request->getHeader('Host');
     }
     if ($request->hasHeader('Connection')) {
         $server['HTTP_CONNECTION'] = $request->getHeader('Connection');
     }
     if ($request->hasHeader('User-Agent')) {
         $server['HTTP_USER_AGENT'] = $request->getHeader('User-Agent');
     }
     if ($request->hasHeader('Accept')) {
         $server['HTTP_ACCEPT'] = $request->getHeader('Accept');
     }
     if ($request->hasHeader('Accept-Encoding')) {
         $server['HTTP_ACCEPT_ENCODING'] = $request->getHeader('Accept-Encoding');
     }
     if ($request->hasHeader('Accept-Language')) {
         $server['HTTP_ACCEPT_LANGUAGE'] = $request->getHeader('Accept-Language');
     }
     if ($request->hasHeader('Accept-Charset')) {
         $server['HTTP_ACCEPT_CHARSET'] = $request->getHeader('Accept-Charset');
     }
     if ($request->hasHeader('Cookie')) {
         $server['HTTP_COOKIE'] = $request->getHeader('Cookie');
     }
     if ($request->hasHeader('Referer')) {
         $server['HTTP_REFERER'] = $request->getHeader('Referer');
     }
     // fake _COOKIE
     $cookies = array();
     if ($request->hasHeader('Cookie')) {
         parse_str($request->getHeader('Cookie'), $cookies);
     }
     // @TODO: php.ini - request_order > _REQUEST
     $parameters = array_merge($getParameters, $postParameters);
     // @TODO: fake _FILES
     $files = array();
     // initialize SymfonyRequest
     $sfRequest = SymfonyRequest::create($requestUrl, $requestMethod, $parameters, $cookies, $files, $server);
     try {
         if (null !== $this->customKernel) {
             /** @var $sfResponse Symfony\Components\HttpKernel\Response */
             $sfResponse = $this->customKernel->handle($sfRequest);
         } else {
             /** @var $sfResponse Symfony\Components\HttpKernel\Response */
             $sfResponse = $this->kernel->handle($sfRequest);
         }
     } catch (\Exception $e) {
         $code = 500;
         $status = SymfonyResponse::$statusTexts[$code];
         $headers = array();
         $content = sprintf('<h1>Error %d - %s</h1>', $code, $status);
         // ExceptionController-like view renderer would be cool
         // add Date header
         $date = new \DateTime();
         $headers['Date'] = $date->format(DATE_RFC822);
         // add Content-Length header
         $headers['Content-Length'] = strlen($content);
         // build Response
         $response = $this->container->getServer_ResponseService();
         $response->setHttpVersion($request->getHttpVersion());
         $response->setStatusCode($code, $status);
         $response->addHeaders($headers);
         $response->setBody($content);
         $event->setReturnValue($response);
         return true;
     }
     // add Date header
     $date = new \DateTime();
     $sfResponse->headers->set('Date', $date->format(DATE_RFC822));
     // add Content-Length header
     $sfContent = $sfResponse->getContent();
     $sfResponse->headers->set('Content-Length', strlen($sfContent));
     // build Response
     $response = $this->container->getServer_ResponseService();
     $response->setHttpVersion($sfResponse->getProtocolVersion());
     $response->setStatusCode($sfResponse->getStatusCode());
     $response->addHeaders($sfResponse->headers->all());
     $response->setBody($sfContent);
     $event->setReturnValue($response);
     return true;
 }
Beispiel #9
0
 /**
  * Handles an ESI from the cache.
  *
  * @param Symfony\Components\HttpKernel\Cache\Cache $cache        A Cache instance
  * @param string                                    $uri          The main URI
  * @param string                                    $alt          An alternative URI
  * @param Boolean                                   $ignoreErrors Whether to ignore errors or not
  */
 public function handle(Cache $cache, $uri, $alt, $ignoreErrors)
 {
     $subRequest = Request::create($uri, 'get', array(), $cache->getRequest()->cookies->all(), array(), $cache->getRequest()->server->all());
     try {
         return $cache->handle($subRequest, HttpKernelInterface::EMBEDDED_REQUEST, true);
     } catch (\Exception $e) {
         if ($alt) {
             return $this->handle($cache, $alt, '', $ignoreErrors);
         }
         if (!$ignoreErrors) {
             throw $e;
         }
     }
 }
Beispiel #10
0
 /**
  * Records that an event took place.
  *
  * @param string $event The event name
  */
 protected function record(Request $request, $event)
 {
     $this->traces[$request->getMethod() . ' ' . $request->getPathInfo()][] = $event;
 }
Beispiel #11
0
 protected function storeSimpleEntry($path = null, $headers = array())
 {
     if (null === $path) {
         $path = '/test';
     }
     $this->request = Request::create($path, 'get', array(), array(), array(), $headers);
     $this->response = new Response('test', 200, array('Cache-Control' => 'max-age=420'));
     return $this->store->write($this->request, $this->response);
 }