/** * @param Exception * @return void */ public function renderDefault($exception) { if ($this->isAjax()) { // AJAX request? Just note this error in payload. $this->payload->error = TRUE; $this->terminate(); } elseif ($exception instanceof BadRequestException) { $code = $exception->getCode(); $this->setView(in_array($code, array(403, 404, 405, 410, 500)) ? $code : '4xx'); // load template 403.latte or 404.latte or ... 4xx.latte } else { $this->setView('500'); // load template 500.latte Debug::log($exception, Debug::ERROR); // and log exception } }
/** * Processes request. * * @author Jan Tvrdík * @param PresenterRequest * @return void * @throws Nette\Applicationy\AbortException|\InvalidStateException */ public function processRequest(PresenterRequest $request) { $params = $request->getParams(); $exception = & $params['exception']; if (!isset($exception)) { throw new \InvalidStateException('Missing required parameter - exception.'); } if ($exception instanceof BadRequestException) { $code = $exception->getCode(); $name = in_array($code, array(403, 404, 405, 410, 500)) ? $code : '4xx'; } else { Debug::log($exception, Debug::ERROR); $name = '500'; } $this->page = '@errors/' . $name; $this->sendTemplate(); }
/** * Dispatch a HTTP request to a front controller. * @return void */ public function run() { $httpRequest = $this->getHttpRequest(); $httpResponse = $this->getHttpResponse(); // check HTTP method if ($this->allowedMethods) { $method = $httpRequest->getMethod(); if (!in_array($method, $this->allowedMethods, TRUE)) { $httpResponse->setCode(Nette\Web\IHttpResponse::S501_NOT_IMPLEMENTED); $httpResponse->setHeader('Allow', implode(',', $this->allowedMethods)); echo '<h1>Method ' . htmlSpecialChars($method) . ' is not implemented</h1>'; return; } } // dispatching $request = NULL; $repeatedError = FALSE; do { try { if (count($this->requests) > self::$maxLoop) { throw new ApplicationException('Too many loops detected in application life cycle.'); } if (!$request) { $this->onStartup($this); // autostarts session $session = $this->getSession(); if (!$session->isStarted() && $session->exists()) { $session->start(); } // routing $router = $this->getRouter(); // enable routing debuggger Nette\Debug::addPanel(new RoutingDebugger($router, $httpRequest)); $request = $router->match($httpRequest); if (!$request instanceof PresenterRequest) { $request = NULL; throw new BadRequestException('No route for HTTP request.'); } if (strcasecmp($request->getPresenterName(), $this->errorPresenter) === 0) { throw new BadRequestException('Invalid request. Presenter is not achievable.'); } } $this->requests[] = $request; $this->onRequest($this, $request); // Instantiate presenter $presenter = $request->getPresenterName(); try { $class = $this->getPresenterLoader()->getPresenterClass($presenter); $request->setPresenterName($presenter); } catch (InvalidPresenterException $e) { throw new BadRequestException($e->getMessage(), 404, $e); } $request->freeze(); // Execute presenter $this->presenter = new $class; $response = $this->presenter->run($request); $this->onResponse($this, $response); // Send response if ($response instanceof ForwardingResponse) { $request = $response->getRequest(); continue; } elseif ($response instanceof IPresenterResponse) { $response->send(); } break; } catch (\Exception $e) { // fault barrier $this->onError($this, $e); if (!$this->catchExceptions) { $this->onShutdown($this, $e); throw $e; } if ($repeatedError) { $e = new ApplicationException('An error occured while executing error-presenter', 0, $e); } if (!$httpResponse->isSent()) { $httpResponse->setCode($e instanceof BadRequestException ? $e->getCode() : 500); } if (!$repeatedError && $this->errorPresenter) { $repeatedError = TRUE; if ($this->presenter instanceof Presenter) { try { $this->presenter->forward(":$this->errorPresenter:", array('exception' => $e)); } catch (AbortException $foo) { $request = $this->presenter->getLastCreatedRequest(); } } else { $request = new PresenterRequest( $this->errorPresenter, PresenterRequest::FORWARD, array('exception' => $e) ); } // continue } else { // default error handler if ($e instanceof BadRequestException) { $code = $e->getCode(); } else { $code = 500; Nette\Debug::log($e, Nette\Debug::ERROR); } echo "<!DOCTYPE html><meta http-equiv='Content-Type' content='text/html; charset=utf-8'><meta name=robots content=noindex><meta name=generator content='Nette Framework'>\n\n"; echo "<style>body{color:#333;background:white;width:500px;margin:100px auto}h1{font:bold 47px/1.5 sans-serif;margin:.6em 0}p{font:21px/1.5 Georgia,serif;margin:1.5em 0}small{font-size:70%;color:gray}</style>\n\n"; static $messages = array( 0 => array('Oops...', 'Your browser sent a request that this server could not understand or process.'), 403 => array('Access Denied', 'You do not have permission to view this page. Please try contact the web site administrator if you believe you should be able to view this page.'), 404 => array('Page Not Found', 'The page you requested could not be found. It is possible that the address is incorrect, or that the page no longer exists. Please use a search engine to find what you are looking for.'), 405 => array('Method Not Allowed', 'The requested method is not allowed for the URL.'), 410 => array('Page Not Found', 'The page you requested has been taken off the site. We apologize for the inconvenience.'), 500 => array('Server Error', 'We\'re sorry! The server encountered an internal error and was unable to complete your request. Please try again later.'), ); $message = isset($messages[$code]) ? $messages[$code] : $messages[0]; echo "<title>$message[0]</title>\n\n<h1>$message[0]</h1>\n\n<p>$message[1]</p>\n\n"; if ($code) echo "<p><small>error $code</small></p>"; break; } } } while (1); $this->onShutdown($this, isset($e) ? $e : NULL); }
/** * Dispatch a HTTP request to a front controller. * @return void */ public function run() { $httpRequest = $this->getHttpRequest(); $httpResponse = $this->getHttpResponse(); // check HTTP method if ($this->allowedMethods) { $method = $httpRequest->getMethod(); if (!in_array($method, $this->allowedMethods, TRUE)) { $httpResponse->setCode(Nette\Web\IHttpResponse::S501_NOT_IMPLEMENTED); $httpResponse->setHeader('Allow', implode(',', $this->allowedMethods)); echo '<h1>Method ' . htmlSpecialChars($method) . ' is not implemented</h1>'; return; } } // dispatching $request = NULL; $repeatedError = FALSE; do { try { if (count($this->requests) > self::$maxLoop) { throw new ApplicationException('Too many loops detected in application life cycle.'); } if (!$request) { $this->onStartup($this); // autostarts session $session = $this->getSession(); if (!$session->isStarted() && $session->exists()) { $session->start(); } // routing $router = $this->getRouter(); // enable routing debuggger Nette\Debug::addPanel(new RoutingDebugger($router, $httpRequest)); $request = $router->match($httpRequest); if (!$request instanceof PresenterRequest) { $request = NULL; throw new BadRequestException('No route for HTTP request.'); } if (strcasecmp($request->getPresenterName(), $this->errorPresenter) === 0) { throw new BadRequestException('Invalid request. Presenter is not achievable.'); } } $this->requests[] = $request; $this->onRequest($this, $request); // Instantiate presenter $presenterName = $request->getPresenterName(); try { $this->presenter = $this->getPresenterFactory()->createPresenter($presenterName); } catch (InvalidPresenterException $e) { throw new BadRequestException($e->getMessage(), 404, $e); } $this->getPresenterFactory()->getPresenterClass($presenterName); $request->setPresenterName($presenterName); $request->freeze(); // Execute presenter $response = $this->presenter->run($request); $this->onResponse($this, $response); // Send response if ($response instanceof ForwardingResponse) { $request = $response->getRequest(); continue; } elseif ($response instanceof IPresenterResponse) { $response->send($httpRequest, $httpResponse); } break; } catch (\Exception $e) { // fault barrier $this->onError($this, $e); if (!$this->catchExceptions) { $this->onShutdown($this, $e); throw $e; } if ($repeatedError) { $e = new ApplicationException('An error occured while executing error-presenter', 0, $e); } if (!$httpResponse->isSent()) { $httpResponse->setCode($e instanceof BadRequestException ? $e->getCode() : 500); } if (!$repeatedError && $this->errorPresenter) { $repeatedError = TRUE; if ($this->presenter instanceof Presenter) { try { $this->presenter->forward(":$this->errorPresenter:", array('exception' => $e)); } catch (AbortException $foo) { $request = $this->presenter->getLastCreatedRequest(); } } else { $request = new PresenterRequest( $this->errorPresenter, PresenterRequest::FORWARD, array('exception' => $e) ); } // continue } else { // default error handler if ($e instanceof BadRequestException) { $code = $e->getCode(); } else { $code = 500; Nette\Debug::log($e, Nette\Debug::ERROR); } require __DIR__ . '/templates/error.phtml'; break; } } } while (1); $this->onShutdown($this, isset($e) ? $e : NULL); }