mirror of
https://we.phorge.it/source/phorge.git
synced 2024-12-28 00:10:57 +01:00
Catch unhandled exceptions in index.php
Summary: When there is an exception in `index.php` then we currently get only blank screen. Print it instead. Test Plan: Thrown exceptions on several places of `index.php` and controller, got best results. Reviewers: epriestley, btrahan Reviewed By: epriestley CC: aran, Korvin Differential Revision: https://secure.phabricator.com/D3619
This commit is contained in:
parent
58206a146f
commit
4a2bcc06fe
1 changed files with 141 additions and 136 deletions
|
@ -109,156 +109,157 @@ try {
|
|||
|
||||
PhutilErrorHandler::initialize();
|
||||
|
||||
} catch (Exception $ex) {
|
||||
phabricator_fatal("[Initialization Exception] ".$ex->getMessage());
|
||||
}
|
||||
PhutilErrorHandler::setErrorListener(
|
||||
array('DarkConsoleErrorLogPluginAPI', 'handleErrors'));
|
||||
|
||||
PhutilErrorHandler::setErrorListener(
|
||||
array('DarkConsoleErrorLogPluginAPI', 'handleErrors'));
|
||||
|
||||
foreach (PhabricatorEnv::getEnvConfig('load-libraries') as $library) {
|
||||
phutil_load_library($library);
|
||||
}
|
||||
|
||||
if (PhabricatorEnv::getEnvConfig('phabricator.setup')) {
|
||||
try {
|
||||
PhabricatorSetup::runSetup();
|
||||
} catch (Exception $ex) {
|
||||
echo "EXCEPTION!\n";
|
||||
echo $ex;
|
||||
foreach (PhabricatorEnv::getEnvConfig('load-libraries') as $library) {
|
||||
phutil_load_library($library);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
phabricator_detect_bad_base_uri();
|
||||
|
||||
$translation = PhabricatorEnv::newObjectFromConfig('translation.provider');
|
||||
PhutilTranslator::getInstance()
|
||||
->setLanguage($translation->getLanguage())
|
||||
->addTranslations($translation->getTranslations());
|
||||
|
||||
$host = $_SERVER['HTTP_HOST'];
|
||||
$path = $_REQUEST['__path__'];
|
||||
|
||||
switch ($host) {
|
||||
default:
|
||||
$config_key = 'aphront.default-application-configuration-class';
|
||||
$application = PhabricatorEnv::newObjectFromConfig($config_key);
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
$application->setHost($host);
|
||||
$application->setPath($path);
|
||||
$application->willBuildRequest();
|
||||
$request = $application->buildRequest();
|
||||
|
||||
$write_guard = new AphrontWriteGuard(array($request, 'validateCSRF'));
|
||||
PhabricatorEventEngine::initialize();
|
||||
|
||||
$application->setRequest($request);
|
||||
list($controller, $uri_data) = $application->buildController();
|
||||
|
||||
if ($access_log) {
|
||||
$access_log->setData(
|
||||
array(
|
||||
'U' => (string)$request->getRequestURI()->getPath(),
|
||||
'C' => get_class($controller),
|
||||
));
|
||||
}
|
||||
|
||||
// If execution throws an exception and then trying to render that exception
|
||||
// throws another exception, we want to show the original exception, as it is
|
||||
// likely the root cause of the rendering exception.
|
||||
$original_exception = null;
|
||||
try {
|
||||
$response = $controller->willBeginExecution();
|
||||
|
||||
if ($access_log) {
|
||||
if ($request->getUser() && $request->getUser()->getPHID()) {
|
||||
$access_log->setData(
|
||||
array(
|
||||
'u' => $request->getUser()->getUserName(),
|
||||
));
|
||||
if (PhabricatorEnv::getEnvConfig('phabricator.setup')) {
|
||||
try {
|
||||
PhabricatorSetup::runSetup();
|
||||
} catch (Exception $ex) {
|
||||
echo "EXCEPTION!\n";
|
||||
echo $ex;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
if (!$response) {
|
||||
$controller->willProcessRequest($uri_data);
|
||||
$response = $controller->processRequest();
|
||||
}
|
||||
} catch (AphrontRedirectException $ex) {
|
||||
$response = id(new AphrontRedirectResponse())
|
||||
->setURI($ex->getURI());
|
||||
} catch (Exception $ex) {
|
||||
$original_exception = $ex;
|
||||
$response = $application->handleException($ex);
|
||||
}
|
||||
phabricator_detect_bad_base_uri();
|
||||
|
||||
$translation = PhabricatorEnv::newObjectFromConfig('translation.provider');
|
||||
PhutilTranslator::getInstance()
|
||||
->setLanguage($translation->getLanguage())
|
||||
->addTranslations($translation->getTranslations());
|
||||
|
||||
$host = $_SERVER['HTTP_HOST'];
|
||||
$path = $_REQUEST['__path__'];
|
||||
|
||||
switch ($host) {
|
||||
default:
|
||||
$config_key = 'aphront.default-application-configuration-class';
|
||||
$application = PhabricatorEnv::newObjectFromConfig($config_key);
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
$application->setHost($host);
|
||||
$application->setPath($path);
|
||||
$application->willBuildRequest();
|
||||
$request = $application->buildRequest();
|
||||
|
||||
$write_guard = new AphrontWriteGuard(array($request, 'validateCSRF'));
|
||||
PhabricatorEventEngine::initialize();
|
||||
|
||||
$application->setRequest($request);
|
||||
list($controller, $uri_data) = $application->buildController();
|
||||
|
||||
try {
|
||||
$response = $controller->didProcessRequest($response);
|
||||
$response = $application->willSendResponse($response, $controller);
|
||||
$response->setRequest($request);
|
||||
$response_string = $response->buildResponseString();
|
||||
} catch (Exception $ex) {
|
||||
$write_guard->dispose();
|
||||
if ($access_log) {
|
||||
$access_log->write();
|
||||
}
|
||||
if ($original_exception) {
|
||||
$ex = new PhutilAggregateException(
|
||||
"Multiple exceptions during processing and rendering.",
|
||||
$access_log->setData(
|
||||
array(
|
||||
$original_exception,
|
||||
$ex,
|
||||
'U' => (string)$request->getRequestURI()->getPath(),
|
||||
'C' => get_class($controller),
|
||||
));
|
||||
}
|
||||
phabricator_fatal('[Rendering Exception] '.$ex->getMessage());
|
||||
}
|
||||
|
||||
$write_guard->dispose();
|
||||
// If execution throws an exception and then trying to render that exception
|
||||
// throws another exception, we want to show the original exception, as it is
|
||||
// likely the root cause of the rendering exception.
|
||||
$original_exception = null;
|
||||
try {
|
||||
$response = $controller->willBeginExecution();
|
||||
|
||||
// TODO: Share the $sink->writeResponse() pathway here?
|
||||
if ($access_log) {
|
||||
if ($request->getUser() && $request->getUser()->getPHID()) {
|
||||
$access_log->setData(
|
||||
array(
|
||||
'u' => $request->getUser()->getUserName(),
|
||||
));
|
||||
}
|
||||
}
|
||||
|
||||
$sink = new AphrontPHPHTTPSink();
|
||||
$sink->writeHTTPStatus($response->getHTTPResponseCode());
|
||||
|
||||
$headers = $response->getCacheHeaders();
|
||||
$headers = array_merge($headers, $response->getHeaders());
|
||||
|
||||
$sink->writeHeaders($headers);
|
||||
|
||||
$sink->writeData($response_string);
|
||||
|
||||
if ($access_log) {
|
||||
$access_log->setData(
|
||||
array(
|
||||
'c' => $response->getHTTPResponseCode(),
|
||||
'T' => (int)(1000000 * (microtime(true) - $__start__)),
|
||||
));
|
||||
$access_log->write();
|
||||
}
|
||||
|
||||
if (DarkConsoleXHProfPluginAPI::isProfilerRequested()) {
|
||||
$profile = DarkConsoleXHProfPluginAPI::stopProfiler();
|
||||
$profile_sample = id(new PhabricatorXHProfSample())
|
||||
->setFilePHID($profile);
|
||||
if (empty($_REQUEST['__profile__'])) {
|
||||
$sample_rate = PhabricatorEnv::getEnvConfig('debug.profile-rate');
|
||||
} else {
|
||||
$sample_rate = 0;
|
||||
if (!$response) {
|
||||
$controller->willProcessRequest($uri_data);
|
||||
$response = $controller->processRequest();
|
||||
}
|
||||
} catch (AphrontRedirectException $ex) {
|
||||
$response = id(new AphrontRedirectResponse())
|
||||
->setURI($ex->getURI());
|
||||
} catch (Exception $ex) {
|
||||
$original_exception = $ex;
|
||||
$response = $application->handleException($ex);
|
||||
}
|
||||
$profile_sample->setSampleRate($sample_rate);
|
||||
|
||||
try {
|
||||
$response = $controller->didProcessRequest($response);
|
||||
$response = $application->willSendResponse($response, $controller);
|
||||
$response->setRequest($request);
|
||||
$response_string = $response->buildResponseString();
|
||||
} catch (Exception $ex) {
|
||||
$write_guard->dispose();
|
||||
if ($access_log) {
|
||||
$access_log->write();
|
||||
}
|
||||
if ($original_exception) {
|
||||
$ex = new PhutilAggregateException(
|
||||
"Multiple exceptions during processing and rendering.",
|
||||
array(
|
||||
$original_exception,
|
||||
$ex,
|
||||
));
|
||||
}
|
||||
phabricator_fatal('[Rendering Exception] '.$ex->getMessage());
|
||||
}
|
||||
|
||||
$write_guard->dispose();
|
||||
|
||||
// TODO: Share the $sink->writeResponse() pathway here?
|
||||
|
||||
$sink = new AphrontPHPHTTPSink();
|
||||
$sink->writeHTTPStatus($response->getHTTPResponseCode());
|
||||
|
||||
$headers = $response->getCacheHeaders();
|
||||
$headers = array_merge($headers, $response->getHeaders());
|
||||
|
||||
$sink->writeHeaders($headers);
|
||||
|
||||
$sink->writeData($response_string);
|
||||
|
||||
if ($access_log) {
|
||||
$profile_sample->setUsTotal($access_log->getData('T'))
|
||||
->setHostname($access_log->getData('h'))
|
||||
->setRequestPath($access_log->getData('U'))
|
||||
->setController($access_log->getData('C'))
|
||||
->setUserPHID($request->getUser()->getPHID());
|
||||
$access_log->setData(
|
||||
array(
|
||||
'c' => $response->getHTTPResponseCode(),
|
||||
'T' => (int)(1000000 * (microtime(true) - $__start__)),
|
||||
));
|
||||
$access_log->write();
|
||||
}
|
||||
$profile_sample->save();
|
||||
|
||||
if (DarkConsoleXHProfPluginAPI::isProfilerRequested()) {
|
||||
$profile = DarkConsoleXHProfPluginAPI::stopProfiler();
|
||||
$profile_sample = id(new PhabricatorXHProfSample())
|
||||
->setFilePHID($profile);
|
||||
if (empty($_REQUEST['__profile__'])) {
|
||||
$sample_rate = PhabricatorEnv::getEnvConfig('debug.profile-rate');
|
||||
} else {
|
||||
$sample_rate = 0;
|
||||
}
|
||||
$profile_sample->setSampleRate($sample_rate);
|
||||
if ($access_log) {
|
||||
$profile_sample->setUsTotal($access_log->getData('T'))
|
||||
->setHostname($access_log->getData('h'))
|
||||
->setRequestPath($access_log->getData('U'))
|
||||
->setController($access_log->getData('C'))
|
||||
->setUserPHID($request->getUser()->getPHID());
|
||||
}
|
||||
$profile_sample->save();
|
||||
}
|
||||
|
||||
} catch (Exception $ex) {
|
||||
phabricator_fatal("[Exception] ".$ex->getMessage());
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @group aphront
|
||||
*/
|
||||
|
@ -352,11 +353,15 @@ function phabricator_fatal($msg) {
|
|||
|
||||
global $access_log;
|
||||
if ($access_log) {
|
||||
$access_log->setData(
|
||||
array(
|
||||
'c' => 500,
|
||||
));
|
||||
$access_log->write();
|
||||
try {
|
||||
$access_log->setData(
|
||||
array(
|
||||
'c' => 500,
|
||||
));
|
||||
$access_log->write();
|
||||
} catch (Exception $ex) {
|
||||
$msg .= "\nMoreover unable to write to access log.";
|
||||
}
|
||||
}
|
||||
|
||||
header(
|
||||
|
|
Loading…
Reference in a new issue