From 5309e64949c76e457ac4296c072b6d4847053208 Mon Sep 17 00:00:00 2001 From: Molkobain Date: Mon, 8 Jul 2019 16:55:23 +0200 Subject: [PATCH 1/5] Fix toolbar load when GET params are present in "_wdt" route When using a custom router that inject GET parameters, eg: ``` # services.yaml parameters: # Replace default url generator service router.options.generator_base_class: Combodo\iTop\Portal\Routing\UrlGenerator ``` The path generated by the toolbar JS is HTML entity encoded which breaks the JS call (`&` becomes `&`). --- .../Resources/views/Profiler/toolbar_js.html.twig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Symfony/Bundle/WebProfilerBundle/Resources/views/Profiler/toolbar_js.html.twig b/src/Symfony/Bundle/WebProfilerBundle/Resources/views/Profiler/toolbar_js.html.twig index f13edfcfeb..9da75d0559 100644 --- a/src/Symfony/Bundle/WebProfilerBundle/Resources/views/Profiler/toolbar_js.html.twig +++ b/src/Symfony/Bundle/WebProfilerBundle/Resources/views/Profiler/toolbar_js.html.twig @@ -15,7 +15,7 @@ Sfjs.load( 'sfwdt{{ token }}', - '{{ path("_wdt", { "token": token }) }}', + '{{ path("_wdt", { "token": token })|escape('js') }}', function(xhr, el) { /* Evaluate embedded scripts inside the toolbar */ From 5564e149cb57f549a5a9c5fedb8824a3614d5f36 Mon Sep 17 00:00:00 2001 From: Markus Fasselt Date: Sun, 4 Aug 2019 11:58:04 +0200 Subject: [PATCH 2/5] [Translation] Collect original locale in case of fallback translation --- .../views/Collector/translation.html.twig | 14 ++++++++++---- .../Translation/DataCollectorTranslator.php | 5 +++-- .../Tests/DataCollectorTranslatorTest.php | 11 ++++++++--- 3 files changed, 21 insertions(+), 9 deletions(-) diff --git a/src/Symfony/Bundle/WebProfilerBundle/Resources/views/Collector/translation.html.twig b/src/Symfony/Bundle/WebProfilerBundle/Resources/views/Collector/translation.html.twig index cd85ce3bad..79c6e60ffb 100644 --- a/src/Symfony/Bundle/WebProfilerBundle/Resources/views/Collector/translation.html.twig +++ b/src/Symfony/Bundle/WebProfilerBundle/Resources/views/Collector/translation.html.twig @@ -13,7 +13,7 @@ {% set text %}
- Locale + Default locale {{ collector.locale|default('-') }} @@ -73,7 +73,7 @@
{{ collector.locale|default('-') }} - Locale + Default locale
{{ collector.fallbackLocales|join(', ')|default('-') }} @@ -152,7 +152,7 @@
{% else %} {% block fallback_messages %} - {{ helper.render_table(messages_fallback) }} + {{ helper.render_table(messages_fallback, true) }} {% endblock %} {% endif %}
@@ -185,11 +185,14 @@ {% endblock %} -{% macro render_table(messages) %} +{% macro render_table(messages, is_fallback) %} + {% if is_fallback %} + + {% endif %} @@ -200,6 +203,9 @@ {% for message in messages %} + {% if is_fallback %} + + {% endif %}
LocaleFallback localeDomain Times used Message ID
{{ message.locale }}{{ message.fallbackLocale|default('-') }}{{ message.domain }} {{ message.count }} diff --git a/src/Symfony/Component/Translation/DataCollectorTranslator.php b/src/Symfony/Component/Translation/DataCollectorTranslator.php index 7eaf928e7f..e70e5f5e14 100644 --- a/src/Symfony/Component/Translation/DataCollectorTranslator.php +++ b/src/Symfony/Component/Translation/DataCollectorTranslator.php @@ -145,6 +145,7 @@ class DataCollectorTranslator implements TranslatorInterface, TranslatorBagInter $id = (string) $id; $catalogue = $this->translator->getCatalogue($locale); $locale = $catalogue->getLocale(); + $fallbackLocale = null; if ($catalogue->defines($id, $domain)) { $state = self::MESSAGE_DEFINED; } elseif ($catalogue->has($id, $domain)) { @@ -153,10 +154,9 @@ class DataCollectorTranslator implements TranslatorInterface, TranslatorBagInter $fallbackCatalogue = $catalogue->getFallbackCatalogue(); while ($fallbackCatalogue) { if ($fallbackCatalogue->defines($id, $domain)) { - $locale = $fallbackCatalogue->getLocale(); + $fallbackLocale = $fallbackCatalogue->getLocale(); break; } - $fallbackCatalogue = $fallbackCatalogue->getFallbackCatalogue(); } } else { @@ -165,6 +165,7 @@ class DataCollectorTranslator implements TranslatorInterface, TranslatorBagInter $this->messages[] = [ 'locale' => $locale, + 'fallbackLocale' => $fallbackLocale, 'domain' => $domain, 'id' => $id, 'translation' => $translation, diff --git a/src/Symfony/Component/Translation/Tests/DataCollectorTranslatorTest.php b/src/Symfony/Component/Translation/Tests/DataCollectorTranslatorTest.php index 059d074648..5cb7c31a40 100644 --- a/src/Symfony/Component/Translation/Tests/DataCollectorTranslatorTest.php +++ b/src/Symfony/Component/Translation/Tests/DataCollectorTranslatorTest.php @@ -34,6 +34,7 @@ class DataCollectorTranslatorTest extends TestCase 'id' => 'foo', 'translation' => 'foo (en)', 'locale' => 'en', + 'fallbackLocale' => null, 'domain' => 'messages', 'state' => DataCollectorTranslator::MESSAGE_DEFINED, 'parameters' => [], @@ -42,7 +43,8 @@ class DataCollectorTranslatorTest extends TestCase $expectedMessages[] = [ 'id' => 'bar', 'translation' => 'bar (fr)', - 'locale' => 'fr', + 'locale' => 'en', + 'fallbackLocale' => 'fr', 'domain' => 'messages', 'state' => DataCollectorTranslator::MESSAGE_EQUALS_FALLBACK, 'parameters' => [], @@ -52,6 +54,7 @@ class DataCollectorTranslatorTest extends TestCase 'id' => 'choice', 'translation' => 'choice', 'locale' => 'en', + 'fallbackLocale' => null, 'domain' => 'messages', 'state' => DataCollectorTranslator::MESSAGE_MISSING, 'parameters' => [], @@ -60,7 +63,8 @@ class DataCollectorTranslatorTest extends TestCase $expectedMessages[] = [ 'id' => 'bar_ru', 'translation' => 'bar (ru)', - 'locale' => 'ru', + 'locale' => 'en', + 'fallbackLocale' => 'ru', 'domain' => 'messages', 'state' => DataCollectorTranslator::MESSAGE_EQUALS_FALLBACK, 'parameters' => [], @@ -69,7 +73,8 @@ class DataCollectorTranslatorTest extends TestCase $expectedMessages[] = [ 'id' => 'bar_ru', 'translation' => 'bar (ru)', - 'locale' => 'ru', + 'locale' => 'en', + 'fallbackLocale' => 'ru', 'domain' => 'messages', 'state' => DataCollectorTranslator::MESSAGE_EQUALS_FALLBACK, 'parameters' => ['foo' => 'bar'], From c9c7a1118c2ccce9e0afe414344fbfdb4bdd1de0 Mon Sep 17 00:00:00 2001 From: battye Date: Fri, 12 Jul 2019 15:57:23 +0000 Subject: [PATCH 3/5] [Validator] Accept underscores in the URL validator as the URL will resolve correctly --- src/Symfony/Component/Validator/Constraints/UrlValidator.php | 2 +- .../Component/Validator/Tests/Constraints/UrlValidatorTest.php | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/Symfony/Component/Validator/Constraints/UrlValidator.php b/src/Symfony/Component/Validator/Constraints/UrlValidator.php index bdaef756bc..b77701dd7e 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 (%s):// # protocol (([\.\pL\pN-]+:)?([\.\pL\pN-]+)@)? # basic auth ( - ([\pL\pN\pS\-\.])+(\.?([\pL\pN]|xn\-\-[\pL\pN-]+)+\.?) # a domain name + ([\pL\pN\pS\-\_\.])+(\.?([\pL\pN]|xn\-\-[\pL\pN-]+)+\.?) # a domain name | # or \d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3} # an IP address | # or diff --git a/src/Symfony/Component/Validator/Tests/Constraints/UrlValidatorTest.php b/src/Symfony/Component/Validator/Tests/Constraints/UrlValidatorTest.php index ab845d45db..f04dd44bc9 100644 --- a/src/Symfony/Component/Validator/Tests/Constraints/UrlValidatorTest.php +++ b/src/Symfony/Component/Validator/Tests/Constraints/UrlValidatorTest.php @@ -72,6 +72,8 @@ class UrlValidatorTest extends ConstraintValidatorTestCase ['http://www.example.museum'], ['https://example.com/'], ['https://example.com:80/'], + ['http://examp_le.com'], + ['http://www.sub_domain.examp_le.com'], ['http://www.example.coop/'], ['http://www.test-example.com/'], ['http://www.symfony.com/'], @@ -152,7 +154,6 @@ class UrlValidatorTest extends ConstraintValidatorTestCase ['://example.com'], ['http ://example.com'], ['http:/example.com'], - ['http://examp_le.com'], ['http://example.com::aa'], ['http://example.com:aa'], ['ftp://example.fr'], From 9add32a9cac2b137bd553bf1d5cb3ce54c707e7c Mon Sep 17 00:00:00 2001 From: SuRiKmAn Date: Tue, 6 Aug 2019 10:27:39 +0200 Subject: [PATCH 4/5] [Messenger] return empty envelopes when RetryableException occurs --- .../Doctrine/DoctrineReceiverTest.php | 23 +++++++++++++++++++ .../Transport/Doctrine/DoctrineReceiver.php | 14 +++++++++++ src/Symfony/Component/Messenger/composer.json | 2 +- 3 files changed, 38 insertions(+), 1 deletion(-) diff --git a/src/Symfony/Component/Messenger/Tests/Transport/Doctrine/DoctrineReceiverTest.php b/src/Symfony/Component/Messenger/Tests/Transport/Doctrine/DoctrineReceiverTest.php index c284c2536b..9c8b359f09 100644 --- a/src/Symfony/Component/Messenger/Tests/Transport/Doctrine/DoctrineReceiverTest.php +++ b/src/Symfony/Component/Messenger/Tests/Transport/Doctrine/DoctrineReceiverTest.php @@ -11,9 +11,12 @@ namespace Symfony\Component\Messenger\Tests\Transport\Doctrine; +use Doctrine\DBAL\Driver\PDOException; +use Doctrine\DBAL\Exception\DeadlockException; use PHPUnit\Framework\TestCase; use Symfony\Component\Messenger\Envelope; use Symfony\Component\Messenger\Exception\MessageDecodingFailedException; +use Symfony\Component\Messenger\Exception\TransportException; use Symfony\Component\Messenger\Stamp\TransportMessageIdStamp; use Symfony\Component\Messenger\Tests\Fixtures\DummyMessage; use Symfony\Component\Messenger\Transport\Doctrine\Connection; @@ -68,6 +71,26 @@ class DoctrineReceiverTest extends TestCase $receiver->get(); } + public function testOccursRetryableExceptionFromConnection() + { + $serializer = $this->createSerializer(); + $connection = $this->createMock(Connection::class); + $driverException = new PDOException(new \PDOException('Deadlock', 40001)); + $connection->method('get')->willThrowException(new DeadlockException('Deadlock', $driverException)); + $receiver = new DoctrineReceiver($connection, $serializer); + $this->assertSame([], $receiver->get()); + $this->assertSame([], $receiver->get()); + try { + $receiver->get(); + } catch (TransportException $exception) { + // skip, and retry + } + $this->assertSame([], $receiver->get()); + $this->assertSame([], $receiver->get()); + $this->expectException(TransportException::class); + $receiver->get(); + } + public function testAll() { $serializer = $this->createSerializer(); diff --git a/src/Symfony/Component/Messenger/Transport/Doctrine/DoctrineReceiver.php b/src/Symfony/Component/Messenger/Transport/Doctrine/DoctrineReceiver.php index a6a41e8c79..765a3fcffe 100644 --- a/src/Symfony/Component/Messenger/Transport/Doctrine/DoctrineReceiver.php +++ b/src/Symfony/Component/Messenger/Transport/Doctrine/DoctrineReceiver.php @@ -12,6 +12,7 @@ namespace Symfony\Component\Messenger\Transport\Doctrine; use Doctrine\DBAL\DBALException; +use Doctrine\DBAL\Exception\RetryableException; use Symfony\Component\Messenger\Envelope; use Symfony\Component\Messenger\Exception\LogicException; use Symfony\Component\Messenger\Exception\MessageDecodingFailedException; @@ -30,6 +31,8 @@ use Symfony\Component\Messenger\Transport\Serialization\SerializerInterface; */ class DoctrineReceiver implements ReceiverInterface, MessageCountAwareInterface, ListableReceiverInterface { + private const MAX_RETRIES = 3; + private $retryingSafetyCounter = 0; private $connection; private $serializer; @@ -46,6 +49,17 @@ class DoctrineReceiver implements ReceiverInterface, MessageCountAwareInterface, { try { $doctrineEnvelope = $this->connection->get(); + $this->retryingSafetyCounter = 0; // reset counter + } catch (RetryableException $exception) { + // Do nothing when RetryableException occurs less than "MAX_RETRIES" + // as it will likely be resolved on the next call to get() + // Problem with concurrent consumers and database deadlocks + if (++$this->retryingSafetyCounter >= self::MAX_RETRIES) { + $this->retryingSafetyCounter = 0; // reset counter + throw new TransportException($exception->getMessage(), 0, $exception); + } + + return []; } catch (DBALException $exception) { throw new TransportException($exception->getMessage(), 0, $exception); } diff --git a/src/Symfony/Component/Messenger/composer.json b/src/Symfony/Component/Messenger/composer.json index 798940ef5d..728c9fb63b 100644 --- a/src/Symfony/Component/Messenger/composer.json +++ b/src/Symfony/Component/Messenger/composer.json @@ -20,7 +20,7 @@ "psr/log": "~1.0" }, "require-dev": { - "doctrine/dbal": "^2.5", + "doctrine/dbal": "^2.6", "psr/cache": "~1.0", "symfony/console": "~3.4|~4.0", "symfony/debug": "~4.1", From e648a91259ffe9d29f74db8b8552452cf5d8ee94 Mon Sep 17 00:00:00 2001 From: Roland Franssen Date: Fri, 27 Sep 2019 15:17:00 +0200 Subject: [PATCH 5/5] [Form][Validator][Intl] Fix tests --- .../Form/Tests/Extension/Core/Type/LanguageTypeTest.php | 2 -- .../Validator/Tests/Constraints/LanguageValidatorTest.php | 1 - 2 files changed, 3 deletions(-) diff --git a/src/Symfony/Component/Form/Tests/Extension/Core/Type/LanguageTypeTest.php b/src/Symfony/Component/Form/Tests/Extension/Core/Type/LanguageTypeTest.php index 3495f443cc..afb652586f 100644 --- a/src/Symfony/Component/Form/Tests/Extension/Core/Type/LanguageTypeTest.php +++ b/src/Symfony/Component/Form/Tests/Extension/Core/Type/LanguageTypeTest.php @@ -32,8 +32,6 @@ class LanguageTypeTest extends BaseTypeTest ->createView()->vars['choices']; $this->assertContainsEquals(new ChoiceView('en', 'en', 'English'), $choices); - $this->assertContainsEquals(new ChoiceView('en_GB', 'en_GB', 'British English'), $choices); - $this->assertContainsEquals(new ChoiceView('en_US', 'en_US', 'American English'), $choices); $this->assertContainsEquals(new ChoiceView('fr', 'fr', 'French'), $choices); $this->assertContainsEquals(new ChoiceView('my', 'my', 'Burmese'), $choices); } diff --git a/src/Symfony/Component/Validator/Tests/Constraints/LanguageValidatorTest.php b/src/Symfony/Component/Validator/Tests/Constraints/LanguageValidatorTest.php index 31a987bdd3..4991f9850e 100644 --- a/src/Symfony/Component/Validator/Tests/Constraints/LanguageValidatorTest.php +++ b/src/Symfony/Component/Validator/Tests/Constraints/LanguageValidatorTest.php @@ -73,7 +73,6 @@ class LanguageValidatorTest extends ConstraintValidatorTestCase { return [ ['en'], - ['en_US'], ['my'], ]; }