/** * Render an exception as the sole output. * * @param Exception $Ex The exception to render. */ public function renderException($Ex) { if ($this->deliveryMethod() == DELIVERY_METHOD_XHTML) { try { // Pick our route. switch ($Ex->getCode()) { case 401: $route = 'DefaultPermission'; break; case 404: $route = 'Default404'; break; default: $route = '/home/error'; } // Redispatch to our error handler. if (is_a($Ex, 'Gdn_UserException')) { // UserExceptions provide more info. Gdn::dispatcher()->passData('Code', $Ex->getCode())->passData('Exception', $Ex->getMessage())->passData('Message', $Ex->getMessage())->passData('Trace', $Ex->getTraceAsString())->passData('Url', url())->passData('Breadcrumbs', $this->Data('Breadcrumbs', array()))->dispatch($route); } elseif (in_array($Ex->getCode(), array(401, 404))) { // Default forbidden & not found codes. Gdn::dispatcher()->passData('Message', $Ex->getMessage())->passData('Url', url())->dispatch($route); } else { // I dunno! Barf. Gdn_ExceptionHandler($Ex); } } catch (Exception $Ex2) { Gdn_ExceptionHandler($Ex); } return; } // Make sure the database connection is closed before exiting. $this->finalize(); $this->sendHeaders(); $Code = $Ex->getCode(); $Data = array('Code' => $Code, 'Exception' => $Ex->getMessage(), 'Class' => get_class($Ex)); if (debug()) { if ($Trace = trace()) { // Clear passwords from the trace. array_walk_recursive($Trace, function (&$Value, $Key) { if (in_array(strtolower($Key), array('password'))) { $Value = '***'; } }); $Data['Trace'] = $Trace; } if (!is_a($Ex, 'Gdn_UserException')) { $Data['StackTrace'] = $Ex->getTraceAsString(); } $Data['Data'] = $this->Data; } // Try cleaning out any notices or errors. if (ob_get_level()) { ob_clean(); } if ($Code >= 400 && $Code <= 505) { safeHeader("HTTP/1.0 {$Code}", true, $Code); } else { safeHeader('HTTP/1.0 500', true, 500); } switch ($this->deliveryMethod()) { case DELIVERY_METHOD_JSON: if (($Callback = $this->Request->getValueFrom(Gdn_Request::INPUT_GET, 'callback', false)) && $this->allowJSONP()) { safeHeader('Content-Type: application/javascript; charset=' . C('Garden.Charset', 'utf-8'), true); // This is a jsonp request. exit($Callback . '(' . json_encode($Data) . ');'); } else { safeHeader('Content-Type: application/json; charset=' . C('Garden.Charset', 'utf-8'), true); // This is a regular json request. exit(json_encode($Data)); } break; // case DELIVERY_METHOD_XHTML: // Gdn_ExceptionHandler($Ex); // break; // case DELIVERY_METHOD_XHTML: // Gdn_ExceptionHandler($Ex); // break; case DELIVERY_METHOD_XML: safeHeader('Content-Type: text/xml; charset=' . C('Garden.Charset', 'utf-8'), true); array_map('htmlspecialchars', $Data); exit("<Exception><Code>{$Data['Code']}</Code><Class>{$Data['Class']}</Class><Message>{$Data['Exception']}</Message></Exception>"); break; default: safeHeader('Content-Type: text/plain; charset=' . C('Garden.Charset', 'utf-8'), true); exit($Ex->getMessage()); } }
/** * Render an exception as the sole output. * * @param Exception $Ex The exception to render. */ public function RenderException($Ex) { if ($this->DeliveryMethod() == DELIVERY_METHOD_XHTML) { try { switch ($Ex->getCode()) { case 401: Gdn::Dispatcher()->Dispatch('DefaultPermission'); break; case 404: Gdn::Dispatcher()->Dispatch('Default404'); break; default: Gdn_ExceptionHandler($Ex); } } catch (Exception $Ex2) { Gdn_ExceptionHandler($Ex); } return; } // Make sure the database connection is closed before exiting. $this->Finalize(); $this->SendHeaders(); $Code = $Ex->getCode(); if (Debug()) { $Message = $Ex->getMessage() . "\n\n" . $Ex->getTraceAsString(); } else { $Message = $Ex->getMessage(); } if ($Code >= 100 && $Code <= 505) { header("HTTP/1.0 {$Code}", TRUE, $Code); } else { header('HTTP/1.0 500', TRUE, 500); } $Data = array('Code' => $Code, 'Exception' => $Message); switch ($this->DeliveryMethod()) { case DELIVERY_METHOD_JSON: header('Content-Type: application/json', TRUE); if ($Callback = $this->Request->GetValueFrom(Gdn_Request::INPUT_GET, 'callback', FALSE)) { // This is a jsonp request. exit($Callback . '(' . json_encode($Data) . ');'); } else { // This is a regular json request. exit(json_encode($Data)); } break; // case DELIVERY_METHOD_XHTML: // Gdn_ExceptionHandler($Ex); // break; // case DELIVERY_METHOD_XHTML: // Gdn_ExceptionHandler($Ex); // break; case DELIVERY_METHOD_XML: header('Content-Type: text/xml', TRUE); array_map('htmlspecialchars', $Data); exit("<Exception><Code>{$Data['Code']}</Code><Message>{$Data['Exception']}</Message></Exception>"); break; } }
/** * Render an exception as the sole output. * * @param Exception $Ex The exception to render. */ public function RenderException($Ex) { if ($this->DeliveryMethod() == DELIVERY_METHOD_XHTML) { try { if (is_a($Ex, 'Gdn_UserException')) { Gdn::Dispatcher()->PassData('Code', $Ex->getCode())->PassData('Exception', $Ex->getMessage())->PassData('Message', $Ex->getMessage())->PassData('Trace', $Ex->getTraceAsString())->PassData('Url', Url())->PassData('Breadcrumbs', $this->Data('Breadcrumbs', array()))->Dispatch('/home/error'); } else { switch ($Ex->getCode()) { case 401: Gdn::Dispatcher()->PassData('Message', $Ex->getMessage())->PassData('Url', Url())->Dispatch('DefaultPermission'); break; case 404: Gdn::Dispatcher()->PassData('Message', $Ex->getMessage())->PassData('Url', Url())->Dispatch('Default404'); break; default: Gdn_ExceptionHandler($Ex); } } } catch (Exception $Ex2) { Gdn_ExceptionHandler($Ex); } return; } // Make sure the database connection is closed before exiting. $this->Finalize(); $this->SendHeaders(); $Code = $Ex->getCode(); $Data = array('Code' => $Code, 'Exception' => $Ex->getMessage(), 'Class' => get_class($Ex)); if (Debug()) { if ($Trace = Trace()) { // Clear passwords from the trace. array_walk_recursive($Trace, function (&$Value, $Key) { if (in_array(strtolower($Key), array('password'))) { $Value = '***'; } }); $Data['Trace'] = $Trace; } if (!is_a($Ex, 'Gdn_UserException')) { $Data['StackTrace'] = $Ex->getTraceAsString(); } $Data['Data'] = $this->Data; } // Try cleaning out any notices or errors. @ob_clean(); if ($Code >= 400 && $Code <= 505) { safeHeader("HTTP/1.0 {$Code}", TRUE, $Code); } else { safeHeader('HTTP/1.0 500', TRUE, 500); } switch ($this->DeliveryMethod()) { case DELIVERY_METHOD_JSON: if (($Callback = $this->Request->GetValueFrom(Gdn_Request::INPUT_GET, 'callback', FALSE)) && $this->AllowJSONP()) { safeHeader('Content-Type: application/javascript', TRUE); // This is a jsonp request. exit($Callback . '(' . json_encode($Data) . ');'); } else { safeHeader('Content-Type: application/json', TRUE); // This is a regular json request. exit(json_encode($Data)); } break; // case DELIVERY_METHOD_XHTML: // Gdn_ExceptionHandler($Ex); // break; // case DELIVERY_METHOD_XHTML: // Gdn_ExceptionHandler($Ex); // break; case DELIVERY_METHOD_XML: safeHeader('Content-Type: text/xml', TRUE); array_map('htmlspecialchars', $Data); exit("<Exception><Code>{$Data['Code']}</Code><Class>{$Data['Class']}</Class><Message>{$Data['Exception']}</Message></Exception>"); break; default: safeHeader('Content-Type: text/plain', TRUE); exit($Ex->getMessage()); } }