Compare commits

...

11 Commits

Author SHA1 Message Date
Fabien Potencier 189da713c1 Merge branch '2.4' into 2.5
* 2.4:
  added missing test
  fixed CS
  [HttpFoundation] Remove content-related headers if content is empty
  bumped Symfony version to 2.4.8
  removed defaults from PHPUnit configuration

Conflicts:
	src/Symfony/Component/HttpKernel/Kernel.php
2014-07-09 11:05:48 +02:00
Fabien Potencier c9532f4021 Merge branch '2.3' into 2.4
* 2.3:
  fixed CS
  [HttpFoundation] Remove content-related headers if content is empty
  removed defaults from PHPUnit configuration
2014-07-09 11:04:55 +02:00
Fabien Potencier 3e0f14c5ab Merge branch '2.4' into 2.5
* 2.4:
  updated VERSION for 2.4.7
  updated CHANGELOG for 2.4.7
  bumped Symfony version to 2.3.18
  updated VERSION for 2.3.17
  update CONTRIBUTORS for 2.3.17
  updated CHANGELOG for 2.3.17
  added XSD to PHPUnit configuration
  add missing docblock for ProcessBuilder::addEnvironmentVariables()
  bug #11319 [HttpKernel] Ensure the storage exists before purging it in ProfilerTest
  [Translation] Added unescaping of ids in PoFileLoader
  updated italian translation for validation messages
  [DomCrawler] Fix docblocks and formatting.
  [DomCrawler] Remove the query string and the anchor of the uri of a link
  Simplified the Travis test command
  Remove Expression Language services when the component is unavailable
  [Console] Make sure formatter is the same

Conflicts:
	src/Symfony/Component/HttpKernel/Kernel.php
2014-07-08 14:21:33 +02:00
Fabien Potencier 1ae44befec Merge branch '2.3' into 2.4
* 2.3:
  bumped Symfony version to 2.3.18
  updated VERSION for 2.3.17
  update CONTRIBUTORS for 2.3.17
  updated CHANGELOG for 2.3.17
  added XSD to PHPUnit configuration
  bug #11319 [HttpKernel] Ensure the storage exists before purging it in ProfilerTest
  [Translation] Added unescaping of ids in PoFileLoader
  updated italian translation for validation messages
  [DomCrawler] Fix docblocks and formatting.
  [DomCrawler] Remove the query string and the anchor of the uri of a link
  Simplified the Travis test command
  [Console] Make sure formatter is the same

Conflicts:
	src/Symfony/Component/HttpKernel/Kernel.php
2014-07-08 13:46:35 +02:00
Christian Raue 91e3a1480c removed defaults from PHPUnit configuration 2014-07-07 12:13:42 +02:00
Christian Raue 732b41060b added XSD to PHPUnit configuration 2014-07-07 11:57:21 +02:00
Nicolas Grekas b24abbba99 [Debug] work-around https://bugs.php.net/61272 2014-06-11 20:54:02 +02:00
Nicolas Grekas 80fa7316f3 [Debug] simplify code path to remove potential blank pages 2014-06-11 12:05:25 +02:00
Nicolas Grekas 4ebbb9592c [Debug] fix wrong case mismatch exception 2014-06-02 09:03:03 +02:00
Fabien Potencier 6e721ae2cd Merge branch '2.3' into 2.4
* 2.3:
  [Debug] fix #10313: FlattenException not found because of https://bugs.php.net/42098
2014-04-30 08:22:28 +02:00
Nicolas Grekas ca764f8af9 [Debug] fix #10313: FlattenException not found because of https://bugs.php.net/42098 2014-04-29 21:42:43 +02:00
5 changed files with 65 additions and 64 deletions
+1 -1
View File
@@ -175,7 +175,7 @@ class DebugClassLoader
$refl = new \ReflectionClass($class);
$name = $refl->getName();
if ($name !== $class) {
if ($name !== $class && 0 === strcasecmp($name, $class)) {
throw new \RuntimeException(sprintf('Case mismatch between loaded and declared class names: %s vs %s', $class, $name));
}
}
+53 -55
View File
@@ -29,13 +29,15 @@ if (!defined('ENT_SUBSTITUTE')) {
* available, the Response content is always HTML.
*
* @author Fabien Potencier <fabien@symfony.com>
* @author Nicolas Grekas <p@tchwork.com>
*/
class ExceptionHandler
{
private $debug;
private $charset;
private $handler;
private $caughtOutput = 0;
private $caughtBuffer;
private $caughtLength;
public function __construct($debug = true, $charset = 'UTF-8')
{
@@ -68,7 +70,7 @@ class ExceptionHandler
*/
public function setHandler($handler)
{
if (isset($handler) && !is_callable($handler)) {
if (null !== $handler && !is_callable($handler)) {
throw new \LogicException('The exception handler must be a valid PHP callable.');
}
$old = $this->handler;
@@ -78,8 +80,47 @@ class ExceptionHandler
}
/**
* {@inheritdoc}
* Sends a response for the given Exception.
*
* To be as fail-safe as possible, the exception is first handled
* by our simple exception handler, then by the user exception handler.
* The latter takes precedence and any output from the former is cancelled,
* if and only if nothing bad happens in this handling path.
*/
public function handle(\Exception $exception)
{
if (null === $this->handler || $exception instanceof OutOfMemoryException) {
$this->failSafeHandle($exception);
return;
}
$caughtLength = $this->caughtLength = 0;
ob_start(array($this, 'catchOutput'));
$this->failSafeHandle($exception);
while (null === $this->caughtBuffer && ob_end_flush()) {
// Empty loop, everything is in the condition
}
if (isset($this->caughtBuffer[0])) {
ob_start(array($this, 'cleanOutput'));
echo $this->caughtBuffer;
$caughtLength = ob_get_length();
}
$this->caughtBuffer = null;
try {
call_user_func($this->handler, $exception);
$this->caughtLength = $caughtLength;
} catch (\Exception $e) {
if (!$caughtLength) {
// All handlers failed. Let PHP handle that now.
throw $exception;
}
}
}
/**
* Sends a response for the given Exception.
*
* If you have the Symfony HttpFoundation component installed,
@@ -89,57 +130,14 @@ class ExceptionHandler
* @see sendPhpResponse
* @see createResponse
*/
public function handle(\Exception $exception)
private function failSafeHandle(\Exception $exception)
{
if ($exception instanceof OutOfMemoryException) {
if (class_exists('Symfony\Component\HttpFoundation\Response', false)) {
$response = $this->createResponse($exception);
$response->sendHeaders();
$response->sendContent();
} else {
$this->sendPhpResponse($exception);
return;
}
// To be as fail-safe as possible, the exception is first handled
// by our simple exception handler, then by the user exception handler.
// The latter takes precedence and any output from the former is cancelled,
// if and only if nothing bad happens in this handling path.
$caughtOutput = 0;
$this->caughtOutput = false;
ob_start(array($this, 'catchOutput'));
try {
if (class_exists('Symfony\Component\HttpFoundation\Response')) {
$response = $this->createResponse($exception);
$response->sendHeaders();
$response->sendContent();
} else {
$this->sendPhpResponse($exception);
}
} catch (\Exception $e) {
// Ignore this $e exception, we have to deal with $exception
}
if (false === $this->caughtOutput) {
ob_end_clean();
}
if (isset($this->caughtOutput[0])) {
ob_start(array($this, 'cleanOutput'));
echo $this->caughtOutput;
$caughtOutput = ob_get_length();
}
$this->caughtOutput = 0;
if (!empty($this->handler)) {
try {
call_user_func($this->handler, $exception);
if ($caughtOutput) {
$this->caughtOutput = $caughtOutput;
}
} catch (\Exception $e) {
if (!$caughtOutput) {
// All handlers failed. Let PHP handle that now.
throw $exception;
}
}
}
}
@@ -387,7 +385,7 @@ EOF;
*/
public function catchOutput($buffer)
{
$this->caughtOutput = $buffer;
$this->caughtBuffer = $buffer;
return '';
}
@@ -397,9 +395,9 @@ EOF;
*/
public function cleanOutput($buffer)
{
if ($this->caughtOutput) {
if ($this->caughtLength) {
// use substr_replace() instead of substr() for mbstring overloading resistance
$cleanBuffer = substr_replace($buffer, '', 0, $this->caughtOutput);
$cleanBuffer = substr_replace($buffer, '', 0, $this->caughtLength);
if (isset($cleanBuffer[0])) {
$buffer = $cleanBuffer;
}
+5
View File
@@ -151,6 +151,11 @@ class DebugClassLoaderTest extends \PHPUnit_Framework_TestCase
{
$this->assertTrue(class_exists(__NAMESPACE__.'\Fixtures\NotPSR0bis', true));
}
public function testClassAlias()
{
$this->assertTrue(class_exists(__NAMESPACE__.'\Fixtures\ClassAlias', true));
}
}
class ClassLoader
+3
View File
@@ -0,0 +1,3 @@
<?php
class_alias('Symfony\Component\Debug\Tests\Fixtures\NotPSR0bis', 'Symfony\Component\Debug\Tests\Fixtures\ClassAlias');
+3 -8
View File
@@ -1,14 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<phpunit backupGlobals="false"
backupStaticAttributes="false"
<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="http://schema.phpunit.de/4.1/phpunit.xsd"
backupGlobals="false"
colors="true"
convertErrorsToExceptions="true"
convertNoticesToExceptions="true"
convertWarningsToExceptions="true"
processIsolation="false"
stopOnFailure="false"
syntaxCheck="false"
bootstrap="vendor/autoload.php"
>
<testsuites>