Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit e683dfa

Browse files
committed
feature #30957 [Messenger] Remove base64_encode & use addslashes (weaverryan)
This PR was merged into the 4.3-dev branch. Discussion ---------- [Messenger] Remove base64_encode & use addslashes | Q | A | ------------- | --- | Branch? | master | Bug fix? | no | New feature? | yes | BC breaks? | no | Deprecations? | no | Tests pass? | yes | Fixed tickets | none | License | MIT | Doc PR | already covered by existing issue In #30814, we base64_encoded messages because some transports (specifically DoctrineTransport + Postgresql & SQS) do not allow binary data. The downside is that the messages become unreadable, which makes it much less convenient to debug your messages with 3rd party monitoring tools, for example. This PR replaces base64_encode with addslashes. Another alternative (that I first tried in this PR) was to use a blob type, which Drupal does in its code (https://www.drupal.org/project/drupal/issues/690746). But, it still meant that binary data could cause problems with other transports, like SQS. I also put all the serializer config under a nice, neat `serializer` key under messenger. Best seen with `?w=1`. Cheers! Commits ------- 70b448d Reorganizing messenger serializer config and replacing base64_encode with addslashes
2 parents 9aedfeb + 70b448d commit e683dfa

File tree

17 files changed

+73
-54
lines changed

17 files changed

+73
-54
lines changed

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

Lines changed: 17 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1143,20 +1143,25 @@ function ($a) {
11431143
->end()
11441144
->end()
11451145
->end()
1146-
->scalarNode('default_serializer')
1147-
->defaultValue('messenger.transport.native_php_serializer')
1148-
->info('Service id to use as the default serializer for the transports.')
1149-
->end()
1150-
->arrayNode('symfony_serializer')
1146+
->arrayNode('serializer')
11511147
->addDefaultsIfNotSet()
11521148
->children()
1153-
->scalarNode('format')->defaultValue('json')->info('Serialization format for the messenger.transport.symfony_serializer service (which is not the serializer used by default).')->end()
1154-
->arrayNode('context')
1155-
->normalizeKeys(false)
1156-
->useAttributeAsKey('name')
1157-
->defaultValue([])
1158-
->info('Context array for the messenger.transport.symfony_serializer service (which is not the serializer used by default).')
1159-
->prototype('variable')->end()
1149+
->scalarNode('default_serializer')
1150+
->defaultValue('messenger.transport.native_php_serializer')
1151+
->info('Service id to use as the default serializer for the transports.')
1152+
->end()
1153+
->arrayNode('symfony_serializer')
1154+
->addDefaultsIfNotSet()
1155+
->children()
1156+
->scalarNode('format')->defaultValue('json')->info('Serialization format for the messenger.transport.symfony_serializer service (which is not the serializer used by default).')->end()
1157+
->arrayNode('context')
1158+
->normalizeKeys(false)
1159+
->useAttributeAsKey('name')
1160+
->defaultValue([])
1161+
->info('Context array for the messenger.transport.symfony_serializer service (which is not the serializer used by default).')
1162+
->prototype('variable')->end()
1163+
->end()
1164+
->end()
11601165
->end()
11611166
->end()
11621167
->end()

src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1692,9 +1692,9 @@ private function registerMessengerConfiguration(array $config, ContainerBuilder
16921692
$container->removeDefinition('messenger.transport.amqp.factory');
16931693
} else {
16941694
$container->getDefinition('messenger.transport.symfony_serializer')
1695-
->replaceArgument(1, $config['symfony_serializer']['format'])
1696-
->replaceArgument(2, $config['symfony_serializer']['context']);
1697-
$container->setAlias('messenger.default_serializer', $config['default_serializer']);
1695+
->replaceArgument(1, $config['serializer']['symfony_serializer']['format'])
1696+
->replaceArgument(2, $config['serializer']['symfony_serializer']['context']);
1697+
$container->setAlias('messenger.default_serializer', $config['serializer']['default_serializer']);
16981698
}
16991699

17001700
$senderAliases = [];

src/Symfony/Bundle/FrameworkBundle/Resources/config/schema/symfony-1.0.xsd

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -407,17 +407,21 @@
407407

408408
<xsd:complexType name="messenger">
409409
<xsd:sequence>
410-
<xsd:element name="default-serializer" type="xsd:string" minOccurs="0" />
411-
<xsd:element name="symfony-serializer" type="messenger_symfony_serializer" minOccurs="0" />
412-
<xsd:element name="encoder" type="xsd:string" minOccurs="0" />
413-
<xsd:element name="decoder" type="xsd:string" minOccurs="0" />
410+
<xsd:element name="serializer" type="messenger_serializer" minOccurs="0" />
414411
<xsd:element name="routing" type="messenger_routing" minOccurs="0" maxOccurs="unbounded" />
415412
<xsd:element name="transport" type="messenger_transport" minOccurs="0" maxOccurs="unbounded" />
416413
<xsd:element name="bus" type="messenger_bus" minOccurs="0" maxOccurs="unbounded" />
417414
</xsd:sequence>
418415
<xsd:attribute name="default-bus" type="xsd:string" />
419416
</xsd:complexType>
420417

418+
<xsd:complexType name="messenger_serializer">
419+
<xsd:sequence>
420+
<xsd:element name="symfony-serializer" type="messenger_symfony_serializer" minOccurs="0" />
421+
</xsd:sequence>
422+
<xsd:attribute name="default-serializer" type="xsd:string" />
423+
</xsd:complexType>
424+
421425
<xsd:complexType name="messenger_symfony_serializer">
422426
<xsd:sequence>
423427
<xsd:element name="context" type="metadata" minOccurs="0" maxOccurs="unbounded" />

src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/ConfigurationTest.php

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -328,10 +328,12 @@ class_exists(SemaphoreStore::class) && SemaphoreStore::isSupported() ? 'semaphor
328328
'enabled' => !class_exists(FullStack::class) && interface_exists(MessageBusInterface::class),
329329
'routing' => [],
330330
'transports' => [],
331-
'default_serializer' => 'messenger.transport.native_php_serializer',
332-
'symfony_serializer' => [
333-
'format' => 'json',
334-
'context' => [],
331+
'serializer' => [
332+
'default_serializer' => 'messenger.transport.native_php_serializer',
333+
'symfony_serializer' => [
334+
'format' => 'json',
335+
'context' => [],
336+
],
335337
],
336338
'default_bus' => null,
337339
'buses' => ['messenger.bus.default' => ['default_middleware' => true, 'middleware' => []]],

src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/php/messenger.php

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55

66
$container->loadFromExtension('framework', [
77
'messenger' => [
8-
'default_serializer' => false,
98
'routing' => [
109
FooMessage::class => ['sender.bar', 'sender.biz'],
1110
BarMessage::class => 'sender.foo',

src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/php/messenger_routing.php

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,9 @@
33
$container->loadFromExtension('framework', [
44
'serializer' => true,
55
'messenger' => [
6-
'default_serializer' => 'messenger.transport.symfony_serializer',
6+
'serializer' => [
7+
'default_serializer' => 'messenger.transport.symfony_serializer',
8+
],
79
'routing' => [
810
'Symfony\Component\Messenger\Tests\Fixtures\DummyMessage' => ['amqp', 'audit'],
911
'Symfony\Component\Messenger\Tests\Fixtures\SecondMessage' => [

src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/php/messenger_transport.php

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,12 @@
33
$container->loadFromExtension('framework', [
44
'serializer' => true,
55
'messenger' => [
6-
'default_serializer' => 'messenger.transport.symfony_serializer',
7-
'symfony_serializer' => [
8-
'format' => 'csv',
9-
'context' => ['enable_max_depth' => true],
6+
'serializer' => [
7+
'default_serializer' => 'messenger.transport.symfony_serializer',
8+
'symfony_serializer' => [
9+
'format' => 'csv',
10+
'context' => ['enable_max_depth' => true],
11+
],
1012
],
1113
'transports' => [
1214
'default' => 'amqp://localhost/%2f/messages',

src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/php/messenger_transports.php

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,9 @@
33
$container->loadFromExtension('framework', [
44
'serializer' => true,
55
'messenger' => [
6-
'default_serializer' => 'messenger.transport.symfony_serializer',
6+
'serializer' => [
7+
'default_serializer' => 'messenger.transport.symfony_serializer',
8+
],
79
'transports' => [
810
'default' => 'amqp://localhost/%2f/messages',
911
'customised' => [

src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/xml/messenger_routing.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
<framework:config>
99
<framework:serializer enabled="true" />
1010
<framework:messenger>
11-
<framework:default-serializer>messenger.transport.symfony_serializer</framework:default-serializer>
11+
<framework:serializer default-serializer="messenger.transport.symfony_serializer" />
1212
<framework:routing message-class="Symfony\Component\Messenger\Tests\Fixtures\DummyMessage">
1313
<framework:sender service="amqp" />
1414
<framework:sender service="audit" />

src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/xml/messenger_transport.xml

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,13 @@
88
<framework:config>
99
<framework:serializer enabled="true" />
1010
<framework:messenger>
11-
<framework:default-serializer>messenger.transport.symfony_serializer</framework:default-serializer>
12-
<framework:symfony-serializer format="csv">
13-
<framework:context>
14-
<framework:enable_max_depth>true</framework:enable_max_depth>
15-
</framework:context>
16-
</framework:symfony-serializer>
11+
<framework:serializer default-serializer="messenger.transport.symfony_serializer">
12+
<framework:symfony-serializer format="csv">
13+
<framework:context>
14+
<framework:enable_max_depth>true</framework:enable_max_depth>
15+
</framework:context>
16+
</framework:symfony-serializer>
17+
</framework:serializer>
1718
<framework:transport name="default" dsn="amqp://localhost/%2f/messages" />
1819
</framework:messenger>
1920
</framework:config>

src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/xml/messenger_transports.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
<framework:config>
99
<framework:serializer enabled="true" />
1010
<framework:messenger>
11-
<framework:default-serializer>messenger.transport.symfony_serializer</framework:default-serializer>
11+
<framework:serializer default-serializer="messenger.transport.symfony_serializer" />
1212
<framework:transport name="default" dsn="amqp://localhost/%2f/messages" />
1313
<framework:transport name="customised" dsn="amqp://localhost/%2f/messages?exchange_name=exchange_name" serializer="messenger.transport.native_php_serializer">
1414
<framework:options>
Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
framework:
22
messenger:
3-
default_serializer: false
43
routing:
54
'Symfony\Bundle\FrameworkBundle\Tests\Fixtures\Messenger\FooMessage': ['sender.bar', 'sender.biz']
65
'Symfony\Bundle\FrameworkBundle\Tests\Fixtures\Messenger\BarMessage': 'sender.foo'

src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/yml/messenger_routing.yml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
framework:
22
serializer: true
33
messenger:
4-
default_serializer: messenger.transport.symfony_serializer
4+
serializer:
5+
default_serializer: messenger.transport.symfony_serializer
56
routing:
67
'Symfony\Component\Messenger\Tests\Fixtures\DummyMessage': [amqp, audit]
78
'Symfony\Component\Messenger\Tests\Fixtures\SecondMessage':
Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
framework:
22
serializer: true
33
messenger:
4-
default_serializer: messenger.transport.symfony_serializer
5-
symfony_serializer:
6-
format: csv
7-
context:
8-
enable_max_depth: true
4+
serializer:
5+
default_serializer: messenger.transport.symfony_serializer
6+
symfony_serializer:
7+
format: csv
8+
context:
9+
enable_max_depth: true
910
transports:
1011
default: 'amqp://localhost/%2f/messages'

src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/yml/messenger_transports.yml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
framework:
22
serializer: true
33
messenger:
4-
default_serializer: messenger.transport.symfony_serializer
4+
serializer:
5+
default_serializer: messenger.transport.symfony_serializer
56
transports:
67
default: 'amqp://localhost/%2f/messages'
78
customised:

src/Symfony/Component/Messenger/Tests/Transport/Serialization/PhpSerializerTest.php

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,9 @@ public function testEncodedIsDecodable()
2525

2626
$envelope = new Envelope(new DummyMessage('Hello'));
2727

28-
$this->assertEquals($envelope, $serializer->decode($serializer->encode($envelope)));
28+
$encoded = $serializer->encode($envelope);
29+
$this->assertNotContains("\0", $encoded['body'], 'Does not contain the binary characters');
30+
$this->assertEquals($envelope, $serializer->decode($encoded));
2931
}
3032

3133
public function testDecodingFailsWithMissingBodyKey()
@@ -58,7 +60,7 @@ public function testDecodingFailsWithBadClass()
5860
$serializer = new PhpSerializer();
5961

6062
$serializer->decode([
61-
'body' => base64_encode('O:13:"ReceivedSt0mp":0:{}'),
63+
'body' => 'O:13:"ReceivedSt0mp":0:{}',
6264
]);
6365
}
6466
}

src/Symfony/Component/Messenger/Transport/Serialization/PhpSerializer.php

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -30,11 +30,7 @@ public function decode(array $encodedEnvelope): Envelope
3030
throw new MessageDecodingFailedException('Encoded envelope should have at least a "body".');
3131
}
3232

33-
$serializeEnvelope = base64_decode($encodedEnvelope['body']);
34-
35-
if (false === $serializeEnvelope) {
36-
throw new MessageDecodingFailedException('The "body" key could not be base64 decoded.');
37-
}
33+
$serializeEnvelope = stripslashes($encodedEnvelope['body']);
3834

3935
return $this->safelyUnserialize($serializeEnvelope);
4036
}
@@ -44,8 +40,10 @@ public function decode(array $encodedEnvelope): Envelope
4440
*/
4541
public function encode(Envelope $envelope): array
4642
{
43+
$body = addslashes(serialize($envelope));
44+
4745
return [
48-
'body' => base64_encode(serialize($envelope)),
46+
'body' => $body,
4947
];
5048
}
5149

0 commit comments

Comments
 (0)