diff --git a/src/Symfony/Component/Debug/ExceptionHandler.php b/src/Symfony/Component/Debug/ExceptionHandler.php index cd781b5609..458d647f0b 100644 --- a/src/Symfony/Component/Debug/ExceptionHandler.php +++ b/src/Symfony/Component/Debug/ExceptionHandler.php @@ -91,9 +91,11 @@ class ExceptionHandler $exception = FlattenException::create($exception); } - header(sprintf('HTTP/1.0 %s', $exception->getStatusCode())); - foreach ($exception->getHeaders() as $name => $value) { - header($name.': '.$value, false); + if (!headers_sent()) { + header(sprintf('HTTP/1.0 %s', $exception->getStatusCode())); + foreach ($exception->getHeaders() as $name => $value) { + header($name.': '.$value, false); + } } echo $this->decorate($this->getContent($exception), $this->getStylesheet($exception)); diff --git a/src/Symfony/Component/Validator/ConstraintViolation.php b/src/Symfony/Component/Validator/ConstraintViolation.php index ca8d525f67..36a42aaec4 100644 --- a/src/Symfony/Component/Validator/ConstraintViolation.php +++ b/src/Symfony/Component/Validator/ConstraintViolation.php @@ -95,7 +95,14 @@ class ConstraintViolation implements ConstraintViolationInterface */ public function __toString() { - $class = (string) (is_object($this->root) ? get_class($this->root) : $this->root); + if (is_object($this->root)) { + $class = get_class($this->root); + } elseif (is_array($this->root)) { + $class = "Array"; + } else { + $class = (string) $this->root; + } + $propertyPath = (string) $this->propertyPath; $code = $this->code; diff --git a/src/Symfony/Component/Validator/Constraints/UrlValidator.php b/src/Symfony/Component/Validator/Constraints/UrlValidator.php index 1fc380ea9e..9b0f9de651 100644 --- a/src/Symfony/Component/Validator/Constraints/UrlValidator.php +++ b/src/Symfony/Component/Validator/Constraints/UrlValidator.php @@ -25,7 +25,7 @@ class UrlValidator extends ConstraintValidator const PATTERN = '~^ (%s):// # protocol ( - ([\pL\pN\pS-]+\.)+[\pL]+ # a domain name + ([\pL\pN\pS-]+\.)+([\pL]|xn\-\-[\pL\pN-]+)+ # a domain name | # or \d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3} # a IP address | # or diff --git a/src/Symfony/Component/Validator/Tests/ConstraintViolationTest.php b/src/Symfony/Component/Validator/Tests/ConstraintViolationTest.php index e1f06c2428..2ceb0169a1 100644 --- a/src/Symfony/Component/Validator/Tests/ConstraintViolationTest.php +++ b/src/Symfony/Component/Validator/Tests/ConstraintViolationTest.php @@ -33,4 +33,23 @@ EOF; $this->assertSame($expected, (string) $violation); } + + public function testToStringHandlesArrayRoots() + { + $violation = new ConstraintViolation( + '42 cannot be used here', + 'this is the message template', + array(), + array('some_value' => 42), + 'some_value', + null + ); + + $expected = <<assertSame($expected, (string) $violation); + } } diff --git a/src/Symfony/Component/Validator/Tests/Constraints/UrlValidatorTest.php b/src/Symfony/Component/Validator/Tests/Constraints/UrlValidatorTest.php index b335ae30a8..e74bc18c40 100644 --- a/src/Symfony/Component/Validator/Tests/Constraints/UrlValidatorTest.php +++ b/src/Symfony/Component/Validator/Tests/Constraints/UrlValidatorTest.php @@ -91,15 +91,28 @@ class UrlValidatorTest extends \PHPUnit_Framework_TestCase array('http://[::1]:80/'), array('http://[1:2:3::4:5:6:7]/'), array('http://sãopaulo.com/'), + array('http://xn--sopaulo-xwa.com/'), array('http://sãopaulo.com.br/'), + array('http://xn--sopaulo-xwa.com.br/'), array('http://пример.испытание/'), + array('http://xn--e1afmkfd.xn--80akhbyknj4f/'), array('http://مثال.إختبار/'), + array('http://xn--mgbh0fb.xn--kgbechtv/'), array('http://例子.测试/'), + array('http://xn--fsqu00a.xn--0zwm56d/'), array('http://例子.測試/'), + array('http://xn--fsqu00a.xn--g6w251d/'), array('http://例え.テスト/'), + array('http://xn--r8jz45g.xn--zckzah/'), array('http://مثال.آزمایشی/'), + array('http://xn--mgbh0fb.xn--hgbk6aj7f53bba/'), array('http://실례.테스트/'), + array('http://xn--9n2bp8q.xn--9t4b11yi5a/'), array('http://العربية.idn.icann.org/'), + array('http://xn--ogb.idn.icann.org/'), + array('http://xn--e1afmkfd.xn--80akhbyknj4f.xn--e1afmkfd/'), + array('http://xn--espaa-rta.xn--ca-ol-fsay5a/'), + array('http://xn--d1abbgf6aiiy.xn--p1ai/'), array('http://☎.com/'), ); }