Skip to content

Commit 773b4ef

Browse files
committed
bug #37038 Fix invalid char in SQS Headers (jderusse)
This PR was squashed before being merged into the 5.1 branch. Discussion ---------- Fix invalid char in SQS Headers | Q | A | ------------- | --- | Branch? | 5.1 | Bug fix? | yes | New feature? | no | Deprecations? | yes | Tickets | #36525 (comment) | License | MIT | Doc PR | / From [Amazon documnetation](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-message-attributes.html) header's name have constraints: - only `a-zA-Z0-9_\.-` + not start/end with a `.` - 256 char This PR serialize ALL headers in a single SQS Attribute. Commits ------- 76a18b0 Fix invalid char in SQS Headers
2 parents d341254 + 76a18b0 commit 773b4ef

File tree

2 files changed

+25
-3
lines changed

2 files changed

+25
-3
lines changed

src/Symfony/Component/Messenger/Bridge/AmazonSqs/Tests/Transport/AmazonSqsIntegrationTest.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ private function execute(string $dsn): void
4545
$connection->setup();
4646
$this->clearSqs($dsn);
4747

48-
$connection->send('{"message": "Hi"}', ['type' => DummyMessage::class]);
48+
$connection->send('{"message": "Hi"}', ['type' => DummyMessage::class, DummyMessage::class => 'special']);
4949
$this->assertSame(1, $connection->getMessageCount());
5050

5151
$wait = 0;
@@ -54,7 +54,7 @@ private function execute(string $dsn): void
5454
}
5555

5656
$this->assertEquals('{"message": "Hi"}', $encoded['body']);
57-
$this->assertEquals(['type' => DummyMessage::class], $encoded['headers']);
57+
$this->assertEquals(['type' => DummyMessage::class, DummyMessage::class => 'special'], $encoded['headers']);
5858
}
5959

6060
private function clearSqs(string $dsn): void

src/Symfony/Component/Messenger/Bridge/AmazonSqs/Transport/Connection.php

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
class Connection
3131
{
3232
private const AWS_SQS_FIFO_SUFFIX = '.fifo';
33+
private const MESSAGE_ATTRIBUTE_NAME = 'X-Symfony-Messenger';
3334

3435
private const DEFAULT_OPTIONS = [
3536
'buffer_size' => 9,
@@ -200,7 +201,12 @@ private function fetchMessage(): bool
200201

201202
foreach ($this->currentResponse->getMessages() as $message) {
202203
$headers = [];
203-
foreach ($message->getMessageAttributes() as $name => $attribute) {
204+
$attributes = $message->getMessageAttributes();
205+
if (isset($attributes[self::MESSAGE_ATTRIBUTE_NAME]) && 'String' === $attributes[self::MESSAGE_ATTRIBUTE_NAME]->getDataType()) {
206+
$headers = json_decode($attributes[self::MESSAGE_ATTRIBUTE_NAME]->getStringValue(), true);
207+
unset($attributes[self::MESSAGE_ATTRIBUTE_NAME]);
208+
}
209+
foreach ($attributes as $name => $attribute) {
204210
if ('String' !== $attribute->getDataType()) {
205211
continue;
206212
}
@@ -284,13 +290,29 @@ public function send(string $body, array $headers, int $delay = 0, ?string $mess
284290
'MessageAttributes' => [],
285291
];
286292

293+
$specialHeaders = [];
287294
foreach ($headers as $name => $value) {
295+
if ('.' === $name[0] || self::MESSAGE_ATTRIBUTE_NAME === $name || \strlen($name) > 256 || '.' === substr($name, -1) || 'AWS.' === substr($name, 0, \strlen('AWS.')) || 'Amazon.' === substr($name, 0, \strlen('Amazon.')) || preg_match('/([^a-zA-Z0-9_\.-]+|\.\.)/', $name)) {
296+
$specialHeaders[$name] = $value;
297+
298+
continue;
299+
}
300+
288301
$parameters['MessageAttributes'][$name] = new MessageAttributeValue([
289302
'DataType' => 'String',
290303
'StringValue' => $value,
291304
]);
292305
}
293306

307+
if (!empty($specialHeaders)) {
308+
$parameters['MessageAttributes'][self::MESSAGE_ATTRIBUTE_NAME] = new MessageAttributeValue([
309+
'DataType' => 'String',
310+
'StringValue' => json_encode($specialHeaders),
311+
]);
312+
}
313+
314+
dd($parameters);
315+
294316
if (self::isFifoQueue($this->configuration['queue_name'])) {
295317
$parameters['MessageGroupId'] = null !== $messageGroupId ? $messageGroupId : __METHOD__;
296318
$parameters['MessageDeduplicationId'] = null !== $messageDeduplicationId ? $messageDeduplicationId : sha1(json_encode(['body' => $body, 'headers' => $headers]));

0 commit comments

Comments
 (0)