Skip to content

Commit 33c12dd

Browse files
committed
[HttpKernel] Added a way to configure an expression in order to disable HTMLDumper
1 parent f63ec48 commit 33c12dd

File tree

5 files changed

+69
-5
lines changed

5 files changed

+69
-5
lines changed

src/Symfony/Bundle/DebugBundle/DependencyInjection/Configuration.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,11 @@ public function getConfigTreeBuilder()
4141
->min(-1)
4242
->defaultValue(-1)
4343
->end()
44+
->scalarNode('disable_html_for')
45+
->info('Disable HTMLdumper in favor of CliDumper based on an expression')
46+
->example("0 === strpos(request.headers.get('user-agent'), 'curl/')")
47+
->defaultNull()
48+
->end()
4449
->end()
4550
;
4651

src/Symfony/Bundle/DebugBundle/DependencyInjection/DebugExtension.php

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313

1414
use Symfony\Component\Config\FileLocator;
1515
use Symfony\Component\DependencyInjection\ContainerBuilder;
16+
use Symfony\Component\DependencyInjection\Definition;
1617
use Symfony\Component\DependencyInjection\Loader\XmlFileLoader;
1718
use Symfony\Component\HttpKernel\DependencyInjection\Extension;
1819

@@ -37,6 +38,13 @@ public function load(array $configs, ContainerBuilder $container)
3738
$container->getDefinition('var_dumper.cloner')
3839
->addMethodCall('setMaxItems', array($config['max_items']))
3940
->addMethodCall('setMaxString', array($config['max_string_length']));
41+
42+
if ($config['disable_html_for']) {
43+
$container->getDefinition('debug.dump_listener')
44+
->replaceArgument(2, new Definition('Symfony\Bundle\DebugBundle\ExpressionLanguage'))
45+
->replaceArgument(3, $config['disable_html_for'])
46+
;
47+
}
4048
}
4149

4250
/**
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
<?php
2+
3+
/*
4+
* This file is part of the Symfony package.
5+
*
6+
* (c) Fabien Potencier <fabien@symfony.com>
7+
*
8+
* For the full copyright and license information, please view the LICENSE
9+
* file that was distributed with this source code.
10+
*/
11+
12+
namespace Symfony\Bundle\DebugBundle;
13+
14+
use Symfony\Component\Security\Core\Authorization\ExpressionLanguage as BaseExpressionLanguage;
15+
16+
/**
17+
* Adds some functions to the default Symfony Debug ExpressionLanguage.
18+
*
19+
* @author Grégoire Pineau <lyrixx@lyrixx.info>
20+
*/
21+
class ExpressionLanguage extends BaseExpressionLanguage
22+
{
23+
protected function registerFunctions()
24+
{
25+
parent::registerFunctions();
26+
$this->register('strpos', function ($haystack, $needle) {
27+
return sprintf('strpos(%s, %s)', $haystack, $needle);
28+
}, function (array $variables, $haystack, $needle) {
29+
return strpos($haystack, $needle);
30+
});
31+
}
32+
}

src/Symfony/Bundle/DebugBundle/Resources/config/services.xml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@
2121
<tag name="kernel.event_subscriber" />
2222
<argument type="service" id="var_dumper.cloner" />
2323
<argument type="service" id="data_collector.dump" />
24+
<argument>null</argument><!-- Expression language -->
25+
<argument>null</argument><!-- Expression -->
2426
</service>
2527

2628
<service id="var_dumper.cloner" class="Symfony\Component\VarDumper\Cloner\VarCloner" />

src/Symfony/Component/HttpKernel/EventListener/DumpListener.php

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@
1212
namespace Symfony\Component\HttpKernel\EventListener;
1313

1414
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
15+
use Symfony\Component\ExpressionLanguage\ExpressionLanguage;
16+
use Symfony\Component\ExpressionLanguage\SyntaxError;
1517
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
1618
use Symfony\Component\HttpKernel\KernelEvents;
1719
use Symfony\Component\VarDumper\Cloner\ClonerInterface;
@@ -28,21 +30,36 @@ class DumpListener implements EventSubscriberInterface
2830
{
2931
private $cloner;
3032
private $dumper;
33+
private $expressionLanguage;
34+
private $expression;
3135

3236
/**
33-
* @param ClonerInterface $cloner Cloner service.
34-
* @param DataDumperInterface $dumper Dumper service.
37+
* @param ClonerInterface $cloner Cloner service.
38+
* @param DataDumperInterface $dumper Dumper service.
39+
* @param ExpressionLanguage|null $expressionLanguage Expression Language service.
40+
* @param string|null $expression The expression.
3541
*/
36-
public function __construct(ClonerInterface $cloner, DataDumperInterface $dumper)
42+
public function __construct(ClonerInterface $cloner, DataDumperInterface $dumper, ExpressionLanguage $expressionLanguage = null, $expression = null)
3743
{
44+
if (null !== $expression && null === $expressionLanguage) {
45+
throw new \RuntimeException('Unable to use expressions as the Symfony ExpressionLanguage component is not installed.');
46+
}
47+
3848
$this->cloner = $cloner;
3949
$this->dumper = $dumper;
50+
$this->expressionLanguage = $expressionLanguage;
51+
$this->expression = $expression;
4052
}
4153

4254
public function configure(GetResponseEvent $event)
4355
{
44-
// if the request is issued by curl, we do not enable HTML dumper;
45-
if (0 === strpos($event->getRequest()->headers->get('user-agent'), 'curl/')) {
56+
try {
57+
$result = $this->expressionLanguage->evaluate($this->expression, array('request' => $event->getRequest()));
58+
} catch (SyntaxError $e) {
59+
throw new \LogicException(sprintf('The expression "%s" to configure the DumpListener is not valid.', $this->expression), 0, $e);
60+
}
61+
62+
if (isset($result) && $result) {
4663
CliDumper::$defaultColors = true;
4764
CliDumper::$defaultOutput = 'php://output';
4865

0 commit comments

Comments
 (0)