Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit 379b525

Browse filesBrowse files
committed
minor #32693 [ErrorRenderer] Allow disabling debug content in debug mode (preview mode) (yceruto)
This PR was merged into the 4.4 branch. Discussion ---------- [ErrorRenderer] Allow disabling debug content in debug mode (preview mode) | Q | A | ------------- | --- | Branch? | 4.4 | Bug fix? | no | New feature? | yes | BC breaks? | no | Deprecations? | no | Tests pass? | yes | Fixed tickets | - | License | MIT Required by #31398 to show a preview mode of the error for each content format. Usage: https://github.com/symfony/symfony/pull/31398/files#diff-9ff5216ab011f5e48c7835d4138bf825R42 Note that you can't enable the debug content in non-debug mode via `X-Debug`. I also added more tests. Commits ------- a6bef5e Allow disabling debug content in debug mode (preview mode)
2 parents a7852c0 + a6bef5e commit 379b525
Copy full SHA for 379b525

File tree

8 files changed

+199
-21
lines changed
Filter options

8 files changed

+199
-21
lines changed

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

Copy file name to clipboardExpand all lines: src/Symfony/Component/ErrorRenderer/ErrorRenderer/HtmlErrorRenderer.php
+2-1Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -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

Copy file name to clipboardExpand all lines: src/Symfony/Component/ErrorRenderer/ErrorRenderer/JsonErrorRenderer.php
+3-1Lines changed: 3 additions & 1 deletion
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

Copy file name to clipboardExpand all lines: src/Symfony/Component/ErrorRenderer/ErrorRenderer/TxtErrorRenderer.php
+2-1Lines changed: 2 additions & 1 deletion
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

Copy file name to clipboardExpand all lines: src/Symfony/Component/ErrorRenderer/ErrorRenderer/XmlErrorRenderer.php
+2-1Lines changed: 2 additions & 1 deletion
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

Copy file name to clipboardExpand all lines: src/Symfony/Component/ErrorRenderer/Tests/ErrorRenderer/HtmlErrorRendererTest.php
+48-4Lines changed: 48 additions & 4 deletions
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

Copy file name to clipboardExpand all lines: src/Symfony/Component/ErrorRenderer/Tests/ErrorRenderer/JsonErrorRendererTest.php
+44-5Lines changed: 44 additions & 5 deletions
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

Copy file name to clipboardExpand all lines: src/Symfony/Component/ErrorRenderer/Tests/ErrorRenderer/TxtErrorRendererTest.php
+46-4Lines changed: 46 additions & 4 deletions
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

Copy file name to clipboardExpand all lines: src/Symfony/Component/ErrorRenderer/Tests/ErrorRenderer/XmlErrorRendererTest.php
+52-4Lines changed: 52 additions & 4 deletions
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 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.