Allow disabling debug content in debug mode (preview mode)

This commit is contained in:
Yonel Ceruto 2019-07-23 18:13:24 -04:00
parent a7852c0da8
commit a6bef5eacd
8 changed files with 199 additions and 21 deletions

View File

@ -91,10 +91,11 @@ class HtmlErrorRenderer implements ErrorRendererInterface
private function renderException(FlattenException $exception, string $debugTemplate = 'views/exception_full.html.php'): string
{
$debug = $this->debug && ($exception->getHeaders()['X-Debug'] ?? true);
$statusText = $this->escape($exception->getTitle());
$statusCode = $this->escape($exception->getStatusCode());
if (!$this->debug) {
if (!$debug) {
return $this->include('views/error.html.php', [
'statusText' => $statusText,
'statusCode' => $statusCode,

View File

@ -38,12 +38,14 @@ class JsonErrorRenderer implements ErrorRendererInterface
*/
public function render(FlattenException $exception): string
{
$debug = $this->debug && ($exception->getHeaders()['X-Debug'] ?? true);
$content = [
'title' => $exception->getTitle(),
'status' => $exception->getStatusCode(),
'detail' => $exception->getMessage(),
];
if ($this->debug) {
if ($debug) {
$content['exceptions'] = $exception->toArray();
}

View File

@ -38,11 +38,12 @@ class TxtErrorRenderer implements ErrorRendererInterface
*/
public function render(FlattenException $exception): string
{
$debug = $this->debug && ($exception->getHeaders()['X-Debug'] ?? true);
$content = sprintf("[title] %s\n", $exception->getTitle());
$content .= sprintf("[status] %s\n", $exception->getStatusCode());
$content .= sprintf("[detail] %s\n", $exception->getMessage());
if ($this->debug) {
if ($debug) {
foreach ($exception->toArray() as $i => $e) {
$content .= sprintf("[%d] %s: %s\n", $i + 1, $e['class'], $e['message']);
foreach ($e['trace'] as $trace) {

View File

@ -40,13 +40,14 @@ class XmlErrorRenderer implements ErrorRendererInterface
*/
public function render(FlattenException $exception): string
{
$debug = $this->debug && ($exception->getHeaders()['X-Debug'] ?? true);
$title = $this->escapeXml($exception->getTitle());
$message = $this->escapeXml($exception->getMessage());
$statusCode = $this->escapeXml($exception->getStatusCode());
$charset = $this->escapeXml($this->charset);
$exceptions = '';
if ($this->debug) {
if ($debug) {
$exceptions .= '<exceptions>';
foreach ($exception->toArray() as $e) {
$exceptions .= sprintf('<exception class="%s" message="%s"><traces>', $e['class'], $this->escapeXml($e['message']));

View File

@ -12,16 +12,60 @@
namespace Symfony\Component\ErrorRenderer\Tests\ErrorRenderer;
use PHPUnit\Framework\TestCase;
use Symfony\Component\ErrorRenderer\ErrorRenderer\ErrorRendererInterface;
use Symfony\Component\ErrorRenderer\ErrorRenderer\HtmlErrorRenderer;
use Symfony\Component\ErrorRenderer\Exception\FlattenException;
class HtmlErrorRendererTest extends TestCase
{
public function testRender()
/**
* @dataProvider getRenderData
*/
public function testRender(FlattenException $exception, ErrorRendererInterface $errorRenderer, string $expected)
{
$exception = FlattenException::createFromThrowable(new \RuntimeException('Foo'));
$expected = '<!-- Foo (500 Internal Server Error) -->%A<!DOCTYPE html>%A<html lang="en">%A<title>Foo (500 Internal Server Error)</title>%A<!-- Foo (500 Internal Server Error) -->';
$this->assertStringMatchesFormat($expected, $errorRenderer->render($exception));
}
$this->assertStringMatchesFormat($expected, (new HtmlErrorRenderer(true))->render($exception));
public function getRenderData()
{
$expectedDebug = <<<HTML
<!-- Foo (500 Internal Server Error) -->
<!DOCTYPE html>
<html lang="en">
%A<title>Foo (500 Internal Server Error)</title>
%A<div class="trace trace-as-html" id="trace-box-1">%A
<!-- Foo (500 Internal Server Error) -->
HTML;
$expectedNonDebug = <<<HTML
<!DOCTYPE html>
<html>
%A<title>An Error Occurred: Internal Server Error</title>
%A<h2>The server returned a "500 Internal Server Error".</h2>%A
HTML;
yield '->render() returns the HTML content WITH stack traces in debug mode' => [
FlattenException::createFromThrowable(new \RuntimeException('Foo')),
new HtmlErrorRenderer(true),
$expectedDebug,
];
yield '->render() returns the HTML content WITHOUT stack traces in non-debug mode' => [
FlattenException::createFromThrowable(new \RuntimeException('Foo')),
new HtmlErrorRenderer(false),
$expectedNonDebug,
];
yield '->render() returns the HTML content WITHOUT stack traces in debug mode FORCING non-debug via X-Debug header' => [
FlattenException::createFromThrowable(new \RuntimeException('Foo'), null, ['X-Debug' => false]),
new HtmlErrorRenderer(true),
$expectedNonDebug,
];
yield '->render() returns the HTML content WITHOUT stack traces in non-debug mode EVEN FORCING debug via X-Debug header' => [
FlattenException::createFromThrowable(new \RuntimeException('Foo'), null, ['X-Debug' => true]),
new HtmlErrorRenderer(false),
$expectedNonDebug,
];
}
}

View File

@ -12,15 +12,23 @@
namespace Symfony\Component\ErrorRenderer\Tests\ErrorRenderer;
use PHPUnit\Framework\TestCase;
use Symfony\Component\ErrorRenderer\ErrorRenderer\ErrorRendererInterface;
use Symfony\Component\ErrorRenderer\ErrorRenderer\JsonErrorRenderer;
use Symfony\Component\ErrorRenderer\Exception\FlattenException;
class JsonErrorRendererTest extends TestCase
{
public function testRender()
/**
* @dataProvider getRenderData
*/
public function testRender(FlattenException $exception, ErrorRendererInterface $errorRenderer, string $expected)
{
$exception = FlattenException::createFromThrowable(new \RuntimeException('Foo'));
$expected = <<<JSON
$this->assertStringMatchesFormat($expected, $errorRenderer->render($exception));
}
public function getRenderData()
{
$expectedDebug = <<<JSON
{
"title": "Internal Server Error",
"status": 500,
@ -29,9 +37,40 @@ class JsonErrorRendererTest extends TestCase
{
"message": "Foo",
"class": "RuntimeException",
"trace":
"trace": [
%A
JSON;
$this->assertStringStartsWith($expected, (new JsonErrorRenderer(true))->render($exception));
$expectedNonDebug = <<<JSON
{
"title": "Internal Server Error",
"status": 500,
"detail": "Foo"
}
JSON;
yield '->render() returns the JSON content WITH stack traces in debug mode' => [
FlattenException::createFromThrowable(new \RuntimeException('Foo')),
new JsonErrorRenderer(true),
$expectedDebug,
];
yield '->render() returns the JSON content WITHOUT stack traces in non-debug mode' => [
FlattenException::createFromThrowable(new \RuntimeException('Foo')),
new JsonErrorRenderer(false),
$expectedNonDebug,
];
yield '->render() returns the JSON content WITHOUT stack traces in debug mode FORCING non-debug via X-Debug header' => [
FlattenException::createFromThrowable(new \RuntimeException('Foo'), null, ['X-Debug' => false]),
new JsonErrorRenderer(true),
$expectedNonDebug,
];
yield '->render() returns the JSON content WITHOUT stack traces in non-debug mode EVEN FORCING debug via X-Debug header' => [
FlattenException::createFromThrowable(new \RuntimeException('Foo'), null, ['X-Debug' => true]),
new JsonErrorRenderer(false),
$expectedNonDebug,
];
}
}

View File

@ -12,16 +12,58 @@
namespace Symfony\Component\ErrorRenderer\Tests\ErrorRenderer;
use PHPUnit\Framework\TestCase;
use Symfony\Component\ErrorRenderer\ErrorRenderer\ErrorRendererInterface;
use Symfony\Component\ErrorRenderer\ErrorRenderer\TxtErrorRenderer;
use Symfony\Component\ErrorRenderer\Exception\FlattenException;
class TxtErrorRendererTest extends TestCase
{
public function testRender()
/**
* @dataProvider getRenderData
*/
public function testRender(FlattenException $exception, ErrorRendererInterface $errorRenderer, string $expected)
{
$exception = FlattenException::createFromThrowable(new \RuntimeException('Foo'));
$expected = '[title] Internal Server Error%A[status] 500%A[detail] Foo%A[1] RuntimeException: Foo%A';
$this->assertStringMatchesFormat($expected, $errorRenderer->render($exception));
}
$this->assertStringMatchesFormat($expected, (new TxtErrorRenderer(true))->render($exception));
public function getRenderData()
{
$expectedDebug = <<<TXT
[title] Internal Server Error
[status] 500
[detail] Foo
[1] RuntimeException: Foo
in %A
TXT;
$expectedNonDebug = <<<TXT
[title] Internal Server Error
[status] 500
[detail] Foo
TXT;
yield '->render() returns the TXT content WITH stack traces in debug mode' => [
FlattenException::createFromThrowable(new \RuntimeException('Foo')),
new TxtErrorRenderer(true),
$expectedDebug,
];
yield '->render() returns the TXT content WITHOUT stack traces in non-debug mode' => [
FlattenException::createFromThrowable(new \RuntimeException('Foo')),
new TxtErrorRenderer(false),
$expectedNonDebug,
];
yield '->render() returns the TXT content WITHOUT stack traces in debug mode FORCING non-debug via X-Debug header' => [
FlattenException::createFromThrowable(new \RuntimeException('Foo'), null, ['X-Debug' => false]),
new TxtErrorRenderer(true),
$expectedNonDebug,
];
yield '->render() returns the TXT content WITHOUT stack traces in non-debug mode EVEN FORCING debug via X-Debug header' => [
FlattenException::createFromThrowable(new \RuntimeException('Foo'), null, ['X-Debug' => true]),
new TxtErrorRenderer(false),
$expectedNonDebug,
];
}
}

View File

@ -12,16 +12,64 @@
namespace Symfony\Component\ErrorRenderer\Tests\ErrorRenderer;
use PHPUnit\Framework\TestCase;
use Symfony\Component\ErrorRenderer\ErrorRenderer\ErrorRendererInterface;
use Symfony\Component\ErrorRenderer\ErrorRenderer\XmlErrorRenderer;
use Symfony\Component\ErrorRenderer\Exception\FlattenException;
class XmlErrorRendererTest extends TestCase
{
public function testRender()
/**
* @dataProvider getRenderData
*/
public function testRender(FlattenException $exception, ErrorRendererInterface $errorRenderer, string $expected)
{
$exception = FlattenException::createFromThrowable(new \RuntimeException('Foo'));
$expected = '<?xml version="1.0" encoding="UTF-8" ?>%A<problem xmlns="urn:ietf:rfc:7807">%A<title>Internal Server Error</title>%A<status>500</status>%A<detail>Foo</detail>%A';
$this->assertStringMatchesFormat($expected, $errorRenderer->render($exception));
}
$this->assertStringMatchesFormat($expected, (new XmlErrorRenderer(true))->render($exception));
public function getRenderData()
{
$expectedDebug = <<<XML
<?xml version="1.0" encoding="UTF-8" ?>
<problem xmlns="urn:ietf:rfc:7807">
<title>Internal Server Error</title>
<status>500</status>
<detail>Foo</detail>
<exceptions><exception class="RuntimeException" message="Foo"><traces><trace>%A</trace></traces></exception></exceptions>
</problem>
XML;
$expectedNonDebug = <<<XML
<?xml version="1.0" encoding="UTF-8" ?>
<problem xmlns="urn:ietf:rfc:7807">
<title>Internal Server Error</title>
<status>500</status>
<detail>Foo</detail>
</problem>
XML;
yield '->render() returns the XML content WITH stack traces in debug mode' => [
FlattenException::createFromThrowable(new \RuntimeException('Foo')),
new XmlErrorRenderer(true),
$expectedDebug,
];
yield '->render() returns the XML content WITHOUT stack traces in non-debug mode' => [
FlattenException::createFromThrowable(new \RuntimeException('Foo')),
new XmlErrorRenderer(false),
$expectedNonDebug,
];
yield '->render() returns the XML content WITHOUT stack traces in debug mode FORCING non-debug via X-Debug header' => [
FlattenException::createFromThrowable(new \RuntimeException('Foo'), null, ['X-Debug' => false]),
new XmlErrorRenderer(true),
$expectedNonDebug,
];
yield '->render() returns the XML content WITHOUT stack traces in non-debug mode EVEN FORCING debug via X-Debug header' => [
FlattenException::createFromThrowable(new \RuntimeException('Foo'), null, ['X-Debug' => true]),
new XmlErrorRenderer(false),
$expectedNonDebug,
];
}
}