Skip to content

Commit

Permalink
Merge branch '1.x' into 2.x
Browse files Browse the repository at this point in the history
* 1.x:
  Don't clear PHP buffer when an error occurs with debug=true
  Remove duplicate phpdoc
  • Loading branch information
fabpot committed Jun 10, 2019
2 parents d18cba7 + 0390a9d commit b957ff6
Show file tree
Hide file tree
Showing 9 changed files with 86 additions and 9 deletions.
2 changes: 1 addition & 1 deletion CHANGELOG
Original file line number Diff line number Diff line change
Expand Up @@ -255,7 +255,7 @@

* 1.42.2 (2019-XX-XX)

* n/a
* Display partial output (PHP buffer) when an error occurs in debug mode

* 1.42.1 (2019-06-04)

Expand Down
2 changes: 1 addition & 1 deletion src/Extension/DebugExtension.php
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ function twig_var_dump(Environment $env, $context, ...$vars)
return;
}

ob_start(function () { return ''; });
ob_start();

if (!$vars) {
$vars = [];
Expand Down
8 changes: 7 additions & 1 deletion src/Node/MacroNode.php
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,13 @@ public function compile(Compiler $compiler)
->outdent()
->write("]);\n\n")
->write("\$blocks = [];\n\n")
->write("ob_start(function () { return ''; });\n")
;
if ($compiler->getEnvironment()->isDebug()) {
$compiler->write("ob_start();\n");
} else {
$compiler->write("ob_start(function () { return ''; });\n");
}
$compiler
->write("try {\n")
->indent()
->subcompile($this->getNode('body'))
Expand Down
6 changes: 5 additions & 1 deletion src/Node/SetNode.php
Original file line number Diff line number Diff line change
Expand Up @@ -57,8 +57,12 @@ public function compile(Compiler $compiler)
$compiler->raw(')');
} else {
if ($this->getAttribute('capture')) {
if ($compiler->getEnvironment()->isDebug()) {
$compiler->write("ob_start();\n");
} else {
$compiler->write("ob_start(function () { return ''; });\n");
}
$compiler
->write("ob_start(function () { return ''; });\n")
->subcompile($this->getNode('values'))
;
}
Expand Down
8 changes: 7 additions & 1 deletion src/Node/SpacelessNode.php
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,13 @@ public function compile(Compiler $compiler)
{
$compiler
->addDebugInfo($this)
->write("ob_start(function () { return ''; });\n")
;
if ($compiler->getEnvironment()->isDebug()) {
$compiler->write("ob_start();\n");
} else {
$compiler->write("ob_start(function () { return ''; });\n");
}
$compiler
->subcompile($this->getNode('body'))
->write("echo trim(preg_replace('/>\s+</', '><', ob_get_clean()));\n")
;
Expand Down
18 changes: 15 additions & 3 deletions src/Template.php
Original file line number Diff line number Diff line change
Expand Up @@ -223,7 +223,11 @@ public function displayBlock($name, array $context, array $blocks = [], $useBloc
*/
public function renderParentBlock($name, array $context, array $blocks = [])
{
ob_start(function () { return ''; });
if ($this->env->isDebug()) {
ob_start();
} else {
ob_start(function () { return ''; });
}
$this->displayParentBlock($name, $context, $blocks);

return ob_get_clean();
Expand All @@ -244,7 +248,11 @@ public function renderParentBlock($name, array $context, array $blocks = [])
*/
public function renderBlock($name, array $context, array $blocks = [], $useBlocks = true)
{
ob_start(function () { return ''; });
if ($this->env->isDebug()) {
ob_start();
} else {
ob_start(function () { return ''; });
}
$this->displayBlock($name, $context, $blocks, $useBlocks);

return ob_get_clean();
Expand Down Expand Up @@ -375,7 +383,11 @@ public function display(array $context, array $blocks = [])
public function render(array $context)
{
$level = ob_get_level();
ob_start(function () { return ''; });
if ($this->env->isDebug()) {
ob_start();
} else {
ob_start(function () { return ''; });
}
try {
$this->display($context);
} catch (\Throwable $e) {
Expand Down
6 changes: 5 additions & 1 deletion src/TemplateWrapper.php
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,11 @@ public function renderBlock(string $name, array $context = []): string
{
$context = $this->env->mergeGlobals($context);
$level = ob_get_level();
ob_start(function () { return ''; });
if ($this->env->isDebug()) {
ob_start();
} else {
ob_start(function () { return ''; });
}
try {
$this->template->displayBlock($name, $context);
} catch (\Throwable $e) {
Expand Down
14 changes: 14 additions & 0 deletions test/Twig/Tests/ErrorTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -200,6 +200,20 @@ public function getErroredTemplates()
],
];
}

public function testTwigLeakOutputInDebugMode()
{
$output = exec(sprintf('%s %s debug', \PHP_BINARY, __DIR__.'/Fixtures/errors/leak-output.php'));

$this->assertSame('Hello OOPS', $output);
}

public function testDoesNotTwigLeakOutput()
{
$output = exec(sprintf('%s %s', \PHP_BINARY, __DIR__.'/Fixtures/errors/leak-output.php'));

$this->assertSame('', $output);
}
}

class Twig_Tests_ErrorTest_Foo
Expand Down
31 changes: 31 additions & 0 deletions test/Twig/Tests/Fixtures/errors/leak-output.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
<?php

require __DIR__.'/../../../../../vendor/autoload.php';

use Twig\Environment;
use Twig\Extension\AbstractExtension;
use Twig\Loader\ArrayLoader;
use Twig\TwigFilter;

class BrokenExtension extends AbstractExtension
{
public function getFilters()
{
return [
new TwigFilter('broken', [$this, 'broken']),
];
}

public function broken()
{
die('OOPS');
}
}

$loader = new ArrayLoader([
'index.html.twig' => 'Hello {{ "world"|broken }}',
]);
$twig = new Environment($loader, ['debug' => isset($argv[1])]);
$twig->addExtension(new BrokenExtension());

echo $twig->render('index.html.twig');

0 comments on commit b957ff6

Please sign in to comment.