* Fix #3996 * Don't delete any message when duplicate handles
This commit is contained in:
parent
05cdcbcedc
commit
00be464c05
@ -17,6 +17,7 @@ from .exceptions import (
|
|||||||
InvalidAttributeName,
|
InvalidAttributeName,
|
||||||
MessageNotInflight,
|
MessageNotInflight,
|
||||||
ReceiptHandleIsInvalid,
|
ReceiptHandleIsInvalid,
|
||||||
|
BatchEntryIdsNotDistinct,
|
||||||
)
|
)
|
||||||
from .models import sqs_backends
|
from .models import sqs_backends
|
||||||
from .utils import parse_message_attributes, extract_input_message_attributes
|
from .utils import parse_message_attributes, extract_input_message_attributes
|
||||||
@ -330,7 +331,8 @@ class SQSResponse(BaseResponse):
|
|||||||
"""
|
"""
|
||||||
queue_name = self._get_queue_name()
|
queue_name = self._get_queue_name()
|
||||||
|
|
||||||
message_ids = []
|
receipts = []
|
||||||
|
|
||||||
for index in range(1, 11):
|
for index in range(1, 11):
|
||||||
# Loop through looking for messages
|
# Loop through looking for messages
|
||||||
receipt_key = "DeleteMessageBatchRequestEntry.{0}.ReceiptHandle".format(
|
receipt_key = "DeleteMessageBatchRequestEntry.{0}.ReceiptHandle".format(
|
||||||
@ -341,12 +343,25 @@ class SQSResponse(BaseResponse):
|
|||||||
# Found all messages
|
# Found all messages
|
||||||
break
|
break
|
||||||
|
|
||||||
self.sqs_backend.delete_message(queue_name, receipt_handle[0])
|
|
||||||
|
|
||||||
message_user_id_key = "DeleteMessageBatchRequestEntry.{0}.Id".format(index)
|
message_user_id_key = "DeleteMessageBatchRequestEntry.{0}.Id".format(index)
|
||||||
message_user_id = self.querystring.get(message_user_id_key)[0]
|
message_user_id = self.querystring.get(message_user_id_key)[0]
|
||||||
message_ids.append(message_user_id)
|
receipts.append(
|
||||||
|
{"receipt_handle": receipt_handle[0], "msg_user_id": message_user_id}
|
||||||
|
)
|
||||||
|
|
||||||
|
receipt_seen = set()
|
||||||
|
for receipt_and_id in receipts:
|
||||||
|
receipt = receipt_and_id["receipt_handle"]
|
||||||
|
if receipt in receipt_seen:
|
||||||
|
raise BatchEntryIdsNotDistinct(receipt_and_id["msg_user_id"])
|
||||||
|
receipt_seen.add(receipt)
|
||||||
|
|
||||||
|
for receipt_and_id in receipts:
|
||||||
|
self.sqs_backend.delete_message(
|
||||||
|
queue_name, receipt_and_id["receipt_handle"]
|
||||||
|
)
|
||||||
|
|
||||||
|
message_ids = [r["msg_user_id"] for r in receipts]
|
||||||
template = self.response_template(DELETE_MESSAGE_BATCH_RESPONSE)
|
template = self.response_template(DELETE_MESSAGE_BATCH_RESPONSE)
|
||||||
return template.render(message_ids=message_ids)
|
return template.render(message_ids=message_ids)
|
||||||
|
|
||||||
|
@ -1714,6 +1714,34 @@ def test_send_message_batch():
|
|||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@mock_sqs
|
||||||
|
def test_delete_message_batch_with_duplicates():
|
||||||
|
client = boto3.client("sqs", region_name="us-east-1")
|
||||||
|
response = client.create_queue(QueueName="test-queue")
|
||||||
|
queue_url = response["QueueUrl"]
|
||||||
|
client.send_message(QueueUrl=queue_url, MessageBody="coucou")
|
||||||
|
|
||||||
|
messages = client.receive_message(
|
||||||
|
QueueUrl=queue_url, WaitTimeSeconds=0, VisibilityTimeout=0
|
||||||
|
)["Messages"]
|
||||||
|
assert messages, "at least one msg"
|
||||||
|
entries = [
|
||||||
|
{"Id": msg["MessageId"], "ReceiptHandle": msg["ReceiptHandle"]}
|
||||||
|
for msg in [messages[0], messages[0]]
|
||||||
|
]
|
||||||
|
|
||||||
|
with pytest.raises(ClientError) as e:
|
||||||
|
client.delete_message_batch(QueueUrl=queue_url, Entries=entries)
|
||||||
|
ex = e.value
|
||||||
|
assert ex.response["Error"]["Code"] == "BatchEntryIdsNotDistinct"
|
||||||
|
|
||||||
|
# no messages are deleted
|
||||||
|
messages = client.receive_message(QueueUrl=queue_url, WaitTimeSeconds=0).get(
|
||||||
|
"Messages", []
|
||||||
|
)
|
||||||
|
assert messages, "message still in the queue"
|
||||||
|
|
||||||
|
|
||||||
@mock_sqs
|
@mock_sqs
|
||||||
def test_message_attributes_in_receive_message():
|
def test_message_attributes_in_receive_message():
|
||||||
sqs = boto3.resource("sqs", region_name="us-east-1")
|
sqs = boto3.resource("sqs", region_name="us-east-1")
|
||||||
|
Loading…
Reference in New Issue
Block a user