Skip to content

Commit c19d8bf

Browse files
committed
Allow disabling debug content in debug mode (preview mode)
1 parent a7852c0 commit c19d8bf

File tree

8 files changed

+200
-22
lines changed

8 files changed

+200
-22
lines changed

src/Symfony/Component/ErrorRenderer/ErrorRenderer/HtmlErrorRenderer.php

+3-2
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ public function getBody(FlattenException $exception): string
7676
}
7777

7878
/**
79-
* Gets the stylesheet associated with the given exception.
79+
* Gets the stylesheet.
8080
*
8181
* @internal
8282
*/
@@ -91,10 +91,11 @@ public function getStylesheet(): string
9191

9292
private function renderException(FlattenException $exception, string $debugTemplate = 'views/exception_full.html.php'): string
9393
{
94+
$debug = $this->debug && ($exception->getHeaders()['X-Debug'] ?? true);
9495
$statusText = $this->escape($exception->getTitle());
9596
$statusCode = $this->escape($exception->getStatusCode());
9697

97-
if (!$this->debug) {
98+
if (!$debug) {
9899
return $this->include('views/error.html.php', [
99100
'statusText' => $statusText,
100101
'statusCode' => $statusCode,

src/Symfony/Component/ErrorRenderer/ErrorRenderer/JsonErrorRenderer.php

+3-1
Original file line numberDiff line numberDiff line change
@@ -38,12 +38,14 @@ public static function getFormat(): string
3838
*/
3939
public function render(FlattenException $exception): string
4040
{
41+
$debug = $this->debug && ($exception->getHeaders()['X-Debug'] ?? true);
42+
4143
$content = [
4244
'title' => $exception->getTitle(),
4345
'status' => $exception->getStatusCode(),
4446
'detail' => $exception->getMessage(),
4547
];
46-
if ($this->debug) {
48+
if ($debug) {
4749
$content['exceptions'] = $exception->toArray();
4850
}
4951

src/Symfony/Component/ErrorRenderer/ErrorRenderer/TxtErrorRenderer.php

+2-1
Original file line numberDiff line numberDiff line change
@@ -38,11 +38,12 @@ public static function getFormat(): string
3838
*/
3939
public function render(FlattenException $exception): string
4040
{
41+
$debug = $this->debug && ($exception->getHeaders()['X-Debug'] ?? true);
4142
$content = sprintf("[title] %s\n", $exception->getTitle());
4243
$content .= sprintf("[status] %s\n", $exception->getStatusCode());
4344
$content .= sprintf("[detail] %s\n", $exception->getMessage());
4445

45-
if ($this->debug) {
46+
if ($debug) {
4647
foreach ($exception->toArray() as $i => $e) {
4748
$content .= sprintf("[%d] %s: %s\n", $i + 1, $e['class'], $e['message']);
4849
foreach ($e['trace'] as $trace) {

src/Symfony/Component/ErrorRenderer/ErrorRenderer/XmlErrorRenderer.php

+2-1
Original file line numberDiff line numberDiff line change
@@ -40,13 +40,14 @@ public static function getFormat(): string
4040
*/
4141
public function render(FlattenException $exception): string
4242
{
43+
$debug = $this->debug && ($exception->getHeaders()['X-Debug'] ?? true);
4344
$title = $this->escapeXml($exception->getTitle());
4445
$message = $this->escapeXml($exception->getMessage());
4546
$statusCode = $this->escapeXml($exception->getStatusCode());
4647
$charset = $this->escapeXml($this->charset);
4748

4849
$exceptions = '';
49-
if ($this->debug) {
50+
if ($debug) {
5051
$exceptions .= '<exceptions>';
5152
foreach ($exception->toArray() as $e) {
5253
$exceptions .= sprintf('<exception class="%s" message="%s"><traces>', $e['class'], $this->escapeXml($e['message']));

src/Symfony/Component/ErrorRenderer/Tests/ErrorRenderer/HtmlErrorRendererTest.php

+48-4
Original file line numberDiff line numberDiff line change
@@ -12,16 +12,60 @@
1212
namespace Symfony\Component\ErrorRenderer\Tests\ErrorRenderer;
1313

1414
use PHPUnit\Framework\TestCase;
15+
use Symfony\Component\ErrorRenderer\ErrorRenderer\ErrorRendererInterface;
1516
use Symfony\Component\ErrorRenderer\ErrorRenderer\HtmlErrorRenderer;
1617
use Symfony\Component\ErrorRenderer\Exception\FlattenException;
1718

1819
class HtmlErrorRendererTest extends TestCase
1920
{
20-
public function testRender()
21+
/**
22+
* @dataProvider getRenderData
23+
*/
24+
public function testRender(FlattenException $exception, ErrorRendererInterface $errorRenderer, string $expected)
2125
{
22-
$exception = FlattenException::createFromThrowable(new \RuntimeException('Foo'));
23-
$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) -->';
26+
$this->assertStringMatchesFormat($expected, $errorRenderer->render($exception));
27+
}
28+
29+
public function getRenderData()
30+
{
31+
$expectedDebug = <<<HTML
32+
<!-- Foo (500 Internal Server Error) -->
33+
<!DOCTYPE html>
34+
<html lang="en">
35+
%A<title>Foo (500 Internal Server Error)</title>
36+
%A<div class="trace trace-as-html" id="trace-box-1">%A
37+
<!-- Foo (500 Internal Server Error) -->
38+
HTML;
39+
40+
$expectedNonDebug = <<<HTML
41+
<!DOCTYPE html>
42+
<html>
43+
%A<title>An Error Occurred: Internal Server Error</title>
44+
%A<h2>The server returned a "500 Internal Server Error".</h2>%A
45+
HTML;
46+
47+
yield '->render() returns the HTML content WITH stack traces in debug mode' => [
48+
FlattenException::createFromThrowable(new \RuntimeException('Foo')),
49+
new HtmlErrorRenderer(true),
50+
$expectedDebug,
51+
];
52+
53+
yield '->render() returns the HTML content WITHOUT stack traces in non-debug mode' => [
54+
FlattenException::createFromThrowable(new \RuntimeException('Foo')),
55+
new HtmlErrorRenderer(false),
56+
$expectedNonDebug,
57+
];
58+
59+
yield '->render() returns the HTML content WITHOUT stack traces in debug mode FORCING non-debug via X-Debug header' => [
60+
FlattenException::createFromThrowable(new \RuntimeException('Foo'), null, ['X-Debug' => false]),
61+
new HtmlErrorRenderer(true),
62+
$expectedNonDebug,
63+
];
2464

25-
$this->assertStringMatchesFormat($expected, (new HtmlErrorRenderer(true))->render($exception));
65+
yield '->render() returns the HTML content WITHOUT stack traces in non-debug mode EVEN FORCING debug via X-Debug header' => [
66+
FlattenException::createFromThrowable(new \RuntimeException('Foo'), null, ['X-Debug' => true]),
67+
new HtmlErrorRenderer(false),
68+
$expectedNonDebug,
69+
];
2670
}
2771
}

src/Symfony/Component/ErrorRenderer/Tests/ErrorRenderer/JsonErrorRendererTest.php

+44-5
Original file line numberDiff line numberDiff line change
@@ -12,15 +12,23 @@
1212
namespace Symfony\Component\ErrorRenderer\Tests\ErrorRenderer;
1313

1414
use PHPUnit\Framework\TestCase;
15+
use Symfony\Component\ErrorRenderer\ErrorRenderer\ErrorRendererInterface;
1516
use Symfony\Component\ErrorRenderer\ErrorRenderer\JsonErrorRenderer;
1617
use Symfony\Component\ErrorRenderer\Exception\FlattenException;
1718

1819
class JsonErrorRendererTest extends TestCase
1920
{
20-
public function testRender()
21+
/**
22+
* @dataProvider getRenderData
23+
*/
24+
public function testRender(FlattenException $exception, ErrorRendererInterface $errorRenderer, string $expected)
2125
{
22-
$exception = FlattenException::createFromThrowable(new \RuntimeException('Foo'));
23-
$expected = <<<JSON
26+
$this->assertStringMatchesFormat($expected, $errorRenderer->render($exception));
27+
}
28+
29+
public function getRenderData()
30+
{
31+
$expectedDebug = <<<JSON
2432
{
2533
"title": "Internal Server Error",
2634
"status": 500,
@@ -29,9 +37,40 @@ public function testRender()
2937
{
3038
"message": "Foo",
3139
"class": "RuntimeException",
32-
"trace":
40+
"trace": [
41+
%A
42+
JSON;
43+
44+
$expectedNonDebug = <<<JSON
45+
{
46+
"title": "Internal Server Error",
47+
"status": 500,
48+
"detail": "Foo"
49+
}
3350
JSON;
3451

35-
$this->assertStringStartsWith($expected, (new JsonErrorRenderer(true))->render($exception));
52+
yield '->render() returns the JSON content WITH stack traces in debug mode' => [
53+
FlattenException::createFromThrowable(new \RuntimeException('Foo')),
54+
new JsonErrorRenderer(true),
55+
$expectedDebug,
56+
];
57+
58+
yield '->render() returns the JSON content WITHOUT stack traces in non-debug mode' => [
59+
FlattenException::createFromThrowable(new \RuntimeException('Foo')),
60+
new JsonErrorRenderer(false),
61+
$expectedNonDebug,
62+
];
63+
64+
yield '->render() returns the JSON content WITHOUT stack traces in debug mode FORCING non-debug via X-Debug header' => [
65+
FlattenException::createFromThrowable(new \RuntimeException('Foo'), null, ['X-Debug' => false]),
66+
new JsonErrorRenderer(true),
67+
$expectedNonDebug,
68+
];
69+
70+
yield '->render() returns the JSON content WITHOUT stack traces in non-debug mode EVEN FORCING debug via X-Debug header' => [
71+
FlattenException::createFromThrowable(new \RuntimeException('Foo'), null, ['X-Debug' => true]),
72+
new JsonErrorRenderer(false),
73+
$expectedNonDebug,
74+
];
3675
}
3776
}

src/Symfony/Component/ErrorRenderer/Tests/ErrorRenderer/TxtErrorRendererTest.php

+46-4
Original file line numberDiff line numberDiff line change
@@ -12,16 +12,58 @@
1212
namespace Symfony\Component\ErrorRenderer\Tests\ErrorRenderer;
1313

1414
use PHPUnit\Framework\TestCase;
15+
use Symfony\Component\ErrorRenderer\ErrorRenderer\ErrorRendererInterface;
1516
use Symfony\Component\ErrorRenderer\ErrorRenderer\TxtErrorRenderer;
1617
use Symfony\Component\ErrorRenderer\Exception\FlattenException;
1718

1819
class TxtErrorRendererTest extends TestCase
1920
{
20-
public function testRender()
21+
/**
22+
* @dataProvider getRenderData
23+
*/
24+
public function testRender(FlattenException $exception, ErrorRendererInterface $errorRenderer, string $expected)
2125
{
22-
$exception = FlattenException::createFromThrowable(new \RuntimeException('Foo'));
23-
$expected = '[title] Internal Server Error%A[status] 500%A[detail] Foo%A[1] RuntimeException: Foo%A';
26+
$this->assertStringMatchesFormat($expected, $errorRenderer->render($exception));
27+
}
28+
29+
public function getRenderData()
30+
{
31+
$expectedDebug = <<<TXT
32+
[title] Internal Server Error
33+
[status] 500
34+
[detail] Foo
35+
[1] RuntimeException: Foo
36+
in %A
37+
TXT;
38+
39+
$expectedNonDebug = <<<TXT
40+
[title] Internal Server Error
41+
[status] 500
42+
[detail] Foo
43+
TXT;
44+
45+
yield '->render() returns the TXT content WITH stack traces in debug mode' => [
46+
FlattenException::createFromThrowable(new \RuntimeException('Foo')),
47+
new TxtErrorRenderer(true),
48+
$expectedDebug,
49+
];
50+
51+
yield '->render() returns the TXT content WITHOUT stack traces in non-debug mode' => [
52+
FlattenException::createFromThrowable(new \RuntimeException('Foo')),
53+
new TxtErrorRenderer(false),
54+
$expectedNonDebug,
55+
];
56+
57+
yield '->render() returns the TXT content WITHOUT stack traces in debug mode FORCING non-debug via X-Debug header' => [
58+
FlattenException::createFromThrowable(new \RuntimeException('Foo'), null, ['X-Debug' => false]),
59+
new TxtErrorRenderer(true),
60+
$expectedNonDebug,
61+
];
2462

25-
$this->assertStringMatchesFormat($expected, (new TxtErrorRenderer(true))->render($exception));
63+
yield '->render() returns the TXT content WITHOUT stack traces in non-debug mode EVEN FORCING debug via X-Debug header' => [
64+
FlattenException::createFromThrowable(new \RuntimeException('Foo'), null, ['X-Debug' => true]),
65+
new TxtErrorRenderer(false),
66+
$expectedNonDebug,
67+
];
2668
}
2769
}

src/Symfony/Component/ErrorRenderer/Tests/ErrorRenderer/XmlErrorRendererTest.php

+52-4
Original file line numberDiff line numberDiff line change
@@ -12,16 +12,64 @@
1212
namespace Symfony\Component\ErrorRenderer\Tests\ErrorRenderer;
1313

1414
use PHPUnit\Framework\TestCase;
15+
use Symfony\Component\ErrorRenderer\ErrorRenderer\ErrorRendererInterface;
1516
use Symfony\Component\ErrorRenderer\ErrorRenderer\XmlErrorRenderer;
1617
use Symfony\Component\ErrorRenderer\Exception\FlattenException;
1718

1819
class XmlErrorRendererTest extends TestCase
1920
{
20-
public function testRender()
21+
/**
22+
* @dataProvider getRenderData
23+
*/
24+
public function testRender(FlattenException $exception, ErrorRendererInterface $errorRenderer, string $expected)
2125
{
22-
$exception = FlattenException::createFromThrowable(new \RuntimeException('Foo'));
23-
$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';
26+
$this->assertStringMatchesFormat($expected, $errorRenderer->render($exception));
27+
}
28+
29+
public function getRenderData()
30+
{
31+
$expectedDebug = <<<XML
32+
<?xml version="1.0" encoding="UTF-8" ?>
33+
<problem xmlns="urn:ietf:rfc:7807">
34+
<title>Internal Server Error</title>
35+
<status>500</status>
36+
<detail>Foo</detail>
37+
<exceptions><exception class="RuntimeException" message="Foo"><traces><trace>%A</trace></traces></exception></exceptions>
38+
</problem>
39+
XML;
40+
41+
$expectedNonDebug = <<<XML
42+
<?xml version="1.0" encoding="UTF-8" ?>
43+
<problem xmlns="urn:ietf:rfc:7807">
44+
<title>Internal Server Error</title>
45+
<status>500</status>
46+
<detail>Foo</detail>
47+
48+
</problem>
49+
XML;
50+
51+
yield '->render() returns the XML content WITH stack traces in debug mode' => [
52+
FlattenException::createFromThrowable(new \RuntimeException('Foo')),
53+
new XmlErrorRenderer(true),
54+
$expectedDebug,
55+
];
56+
57+
yield '->render() returns the XML content WITHOUT stack traces in non-debug mode' => [
58+
FlattenException::createFromThrowable(new \RuntimeException('Foo')),
59+
new XmlErrorRenderer(false),
60+
$expectedNonDebug,
61+
];
62+
63+
yield '->render() returns the XML content WITHOUT stack traces in debug mode FORCING non-debug via X-Debug header' => [
64+
FlattenException::createFromThrowable(new \RuntimeException('Foo'), null, ['X-Debug' => false]),
65+
new XmlErrorRenderer(true),
66+
$expectedNonDebug,
67+
];
2468

25-
$this->assertStringMatchesFormat($expected, (new XmlErrorRenderer(true))->render($exception));
69+
yield '->render() returns the XML content WITHOUT stack traces in non-debug mode EVEN FORCING debug via X-Debug header' => [
70+
FlattenException::createFromThrowable(new \RuntimeException('Foo'), null, ['X-Debug' => true]),
71+
new XmlErrorRenderer(false),
72+
$expectedNonDebug,
73+
];
2674
}
2775
}

0 commit comments

Comments
 (0)