mirror of
https://we.phorge.it/source/phorge.git
synced 2025-02-27 05:59:08 +01:00
Summary: Fixes T6692. Addresses two main issues: - The write guard would sometimes not get disposed of on exception pathways, generating an unnecessary secondary error which was just a symptom of the original root error. - This was generally confusing and reduced the quality of reports we received because users would report the symptomatic error sometimes instead of the real error. - Instead, reflow the handling so that we always dispose of the write guard if we create one. - If we missed the Controller-level error page generation (normally, a nice page with full CSS, etc), we'd jump straight to Startup-level error page generation (very basic plain text). - A large class of errors occur too early or too late to be handled by Controller-level pages, but many of these errors are not fundamental, and the plain text page is excessively severe. - Provide a mid-level simple HTML error page for errors which can't get full CSS, but also aren't so fundamental that we have no recourse but plain text. Test Plan: Mid-level errors now produce an intentional-looking error page: {F259885} Verified that setup errors still render properly. @chad, feel free to tweak the exception page -- I just did a rough pass on it. Like the setup error stuff, it doesn't have Celerity, so we can't use `{$colors}` and no other CSS will be loaded. Reviewers: chad, btrahan Reviewed By: btrahan Subscribers: epriestley, chad Maniphest Tasks: T6692 Differential Revision: https://secure.phabricator.com/D11126
63 lines
1.5 KiB
PHP
63 lines
1.5 KiB
PHP
<?php
|
|
|
|
abstract class AphrontStandaloneHTMLResponse
|
|
extends AphrontHTMLResponse {
|
|
|
|
abstract protected function getResources();
|
|
abstract protected function getResponseTitle();
|
|
abstract protected function getResponseBodyClass();
|
|
abstract protected function getResponseBody();
|
|
abstract protected function buildPlainTextResponseString();
|
|
|
|
final public function buildResponseString() {
|
|
// Check to make sure we aren't requesting this via Ajax or Conduit.
|
|
if (isset($_REQUEST['__ajax__']) || isset($_REQUEST['__conduit__'])) {
|
|
return (string)hsprintf('%s', $this->buildPlainTextResponseString());
|
|
}
|
|
|
|
$title = $this->getResponseTitle();
|
|
$resources = $this->buildResources();
|
|
$body_class = $this->getResponseBodyClass();
|
|
$body = $this->getResponseBody();
|
|
|
|
return (string)hsprintf(
|
|
<<<EOTEMPLATE
|
|
<!DOCTYPE html>
|
|
<html>
|
|
<head>
|
|
<meta charset="UTF-8" />
|
|
<title>%s</title>
|
|
%s
|
|
</head>
|
|
%s
|
|
</html>
|
|
EOTEMPLATE
|
|
,
|
|
$title,
|
|
$resources,
|
|
phutil_tag(
|
|
'body',
|
|
array(
|
|
'class' => $body_class,
|
|
),
|
|
$body));
|
|
}
|
|
|
|
private function buildResources() {
|
|
$paths = $this->getResources();
|
|
|
|
$webroot = dirname(phutil_get_library_root('phabricator')).'/webroot/';
|
|
|
|
$resources = array();
|
|
foreach ($paths as $path) {
|
|
$resources[] = phutil_tag(
|
|
'style',
|
|
array('type' => 'text/css'),
|
|
phutil_safe_html(Filesystem::readFile($webroot.'/rsrc/'.$path)));
|
|
}
|
|
|
|
return phutil_implode_html("\n", $resources);
|
|
}
|
|
|
|
|
|
}
|