SQS - Raise error message when providing an invalid value for the queue_url parameter (#3657)

This commit is contained in:
Bert Blommers 2021-08-28 06:19:01 +01:00 committed by GitHub
parent 684cafa2b8
commit 6f4b6080f8
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 74 additions and 33 deletions

View File

@ -138,3 +138,13 @@ class OverLimit(RESTError):
super(OverLimit, self).__init__( super(OverLimit, self).__init__(
"OverLimit", "{} Actions were found, maximum allowed is 7.".format(count) "OverLimit", "{} Actions were found, maximum allowed is 7.".format(count)
) )
class InvalidAddress(RESTError):
code = 400
def __init__(self, address):
super(InvalidAddress, self).__init__(
"InvalidAddress",
"The address {} is not valid for this endpoint.".format(address),
)

View File

@ -14,6 +14,7 @@ from urllib.parse import urlparse
from .exceptions import ( from .exceptions import (
EmptyBatchRequest, EmptyBatchRequest,
InvalidAddress,
InvalidAttributeName, InvalidAttributeName,
MessageNotInflight, MessageNotInflight,
ReceiptHandleIsInvalid, ReceiptHandleIsInvalid,
@ -51,11 +52,14 @@ class SQSResponse(BaseResponse):
def _get_queue_name(self): def _get_queue_name(self):
try: try:
queue_name = self.querystring.get("QueueUrl")[0].split("/")[-1] queue_url = self.querystring.get("QueueUrl")[0]
if queue_url.startswith("http://") or queue_url.startswith("https://"):
return queue_url.split("/")[-1]
else:
raise InvalidAddress(queue_url)
except TypeError: except TypeError:
# Fallback to reading from the URL # Fallback to reading from the URL for botocore
queue_name = self.path.split("/")[-1] return self.path.split("/")[-1]
return queue_name
def _get_validated_visibility_timeout(self, timeout=None): def _get_validated_visibility_timeout(self, timeout=None):
""" """

View File

@ -311,20 +311,15 @@ def test_get_queue_url_error_not_exists():
@mock_sqs @mock_sqs
def test_get_nonexistent_queue(): def test_get_nonexistent_queue():
sqs = boto3.resource("sqs", region_name="us-east-1") sqs = boto3.resource("sqs", region_name="us-east-1")
with pytest.raises(ClientError) as err:
sqs.get_queue_by_name(QueueName="non-existing-queue")
ex = err.value
ex.operation_name.should.equal("GetQueueUrl")
ex.response["Error"]["Code"].should.equal("AWS.SimpleQueueService.NonExistentQueue")
ex.response["Error"]["Message"].should.equal(
"The specified queue does not exist for this wsdl version."
)
with pytest.raises(ClientError) as err: with pytest.raises(ClientError) as err:
sqs.Queue("http://whatever-incorrect-queue-address").load() sqs.Queue("http://whatever-incorrect-queue-address").load()
ex = err.value ex = err.value
ex.operation_name.should.equal("GetQueueAttributes") ex.operation_name.should.equal("GetQueueAttributes")
ex.response["Error"]["Code"].should.equal("AWS.SimpleQueueService.NonExistentQueue") ex.response["Error"]["Code"].should.equal("AWS.SimpleQueueService.NonExistentQueue")
ex.response["Error"]["Message"].should.equal(
"The specified queue does not exist for this wsdl version."
)
@mock_sqs @mock_sqs
@ -633,8 +628,10 @@ def test_get_queue_with_prefix():
def test_delete_queue(): def test_delete_queue():
sqs = boto3.resource("sqs", region_name="us-east-1") sqs = boto3.resource("sqs", region_name="us-east-1")
conn = boto3.client("sqs", region_name="us-east-1") conn = boto3.client("sqs", region_name="us-east-1")
conn.create_queue(QueueName="test-queue", Attributes={"VisibilityTimeout": "3"}) q_resp = conn.create_queue(
queue = sqs.Queue("test-queue") QueueName="test-queue", Attributes={"VisibilityTimeout": "3"}
)
queue = sqs.Queue(q_resp["QueueUrl"])
conn.list_queues()["QueueUrls"].should.have.length_of(1) conn.list_queues()["QueueUrls"].should.have.length_of(1)
@ -775,13 +772,15 @@ def test_get_queue_attributes_error_not_exists():
def test_set_queue_attribute(): def test_set_queue_attribute():
sqs = boto3.resource("sqs", region_name="us-east-1") sqs = boto3.resource("sqs", region_name="us-east-1")
conn = boto3.client("sqs", region_name="us-east-1") conn = boto3.client("sqs", region_name="us-east-1")
conn.create_queue(QueueName="test-queue", Attributes={"VisibilityTimeout": "3"}) q_resp = conn.create_queue(
QueueName="test-queue", Attributes={"VisibilityTimeout": "3"}
)
queue = sqs.Queue("test-queue") queue = sqs.Queue(q_resp["QueueUrl"])
queue.attributes["VisibilityTimeout"].should.equal("3") queue.attributes["VisibilityTimeout"].should.equal("3")
queue.set_attributes(Attributes={"VisibilityTimeout": "45"}) queue.set_attributes(Attributes={"VisibilityTimeout": "45"})
queue = sqs.Queue("test-queue") queue = sqs.Queue(q_resp["QueueUrl"])
queue.attributes["VisibilityTimeout"].should.equal("45") queue.attributes["VisibilityTimeout"].should.equal("45")
@ -789,8 +788,8 @@ def test_set_queue_attribute():
def test_send_receive_message_without_attributes(): def test_send_receive_message_without_attributes():
sqs = boto3.resource("sqs", region_name="us-east-1") sqs = boto3.resource("sqs", region_name="us-east-1")
conn = boto3.client("sqs", region_name="us-east-1") conn = boto3.client("sqs", region_name="us-east-1")
conn.create_queue(QueueName="test-queue") q_resp = conn.create_queue(QueueName="test-queue")
queue = sqs.Queue("test-queue") queue = sqs.Queue(q_resp["QueueUrl"])
body_one = "this is a test message" body_one = "this is a test message"
body_two = "this is another test message" body_two = "this is another test message"
@ -819,8 +818,8 @@ def test_send_receive_message_without_attributes():
def test_send_receive_message_with_attributes(): def test_send_receive_message_with_attributes():
sqs = boto3.resource("sqs", region_name="us-east-1") sqs = boto3.resource("sqs", region_name="us-east-1")
conn = boto3.client("sqs", region_name="us-east-1") conn = boto3.client("sqs", region_name="us-east-1")
conn.create_queue(QueueName="test-queue") q_resp = conn.create_queue(QueueName="test-queue")
queue = sqs.Queue("test-queue") queue = sqs.Queue(q_resp["QueueUrl"])
body_one = "this is a test message" body_one = "this is a test message"
body_two = "this is another test message" body_two = "this is another test message"
@ -861,8 +860,8 @@ def test_send_receive_message_with_attributes():
def test_send_receive_message_with_attributes_with_labels(): def test_send_receive_message_with_attributes_with_labels():
sqs = boto3.resource("sqs", region_name="us-east-1") sqs = boto3.resource("sqs", region_name="us-east-1")
conn = boto3.client("sqs", region_name="us-east-1") conn = boto3.client("sqs", region_name="us-east-1")
conn.create_queue(QueueName="test-queue") q_resp = conn.create_queue(QueueName="test-queue")
queue = sqs.Queue("test-queue") queue = sqs.Queue(q_resp["QueueUrl"])
body_one = "this is a test message" body_one = "this is a test message"
body_two = "this is another test message" body_two = "this is another test message"
@ -925,8 +924,8 @@ def test_change_message_visibility_than_permitted():
conn = boto3.client("sqs", region_name="us-east-1") conn = boto3.client("sqs", region_name="us-east-1")
with freeze_time("2015-01-01 12:00:00"): with freeze_time("2015-01-01 12:00:00"):
conn.create_queue(QueueName="test-queue-visibility") q_resp = conn.create_queue(QueueName="test-queue-visibility")
queue = sqs.Queue("test-queue-visibility") queue = sqs.Queue(q_resp["QueueUrl"])
queue.send_message(MessageBody="derp") queue.send_message(MessageBody="derp")
messages = conn.receive_message(QueueUrl=queue.url) messages = conn.receive_message(QueueUrl=queue.url)
messages.get("Messages").should.have.length_of(1) messages.get("Messages").should.have.length_of(1)
@ -955,8 +954,8 @@ def test_change_message_visibility_than_permitted():
def test_send_receive_message_timestamps(): def test_send_receive_message_timestamps():
sqs = boto3.resource("sqs", region_name="us-east-1") sqs = boto3.resource("sqs", region_name="us-east-1")
conn = boto3.client("sqs", region_name="us-east-1") conn = boto3.client("sqs", region_name="us-east-1")
conn.create_queue(QueueName="test-queue") q_resp = conn.create_queue(QueueName="test-queue")
queue = sqs.Queue("test-queue") queue = sqs.Queue(q_resp["QueueUrl"])
response = queue.send_message(MessageBody="derp") response = queue.send_message(MessageBody="derp")
assert response["ResponseMetadata"]["RequestId"] assert response["ResponseMetadata"]["RequestId"]
@ -1053,8 +1052,8 @@ def test_send_receive_message_timestamps():
def test_send_receive_message_with_attribute_name(attribute_name, expected): def test_send_receive_message_with_attribute_name(attribute_name, expected):
sqs = boto3.resource("sqs", region_name="us-east-1") sqs = boto3.resource("sqs", region_name="us-east-1")
client = boto3.client("sqs", region_name="us-east-1") client = boto3.client("sqs", region_name="us-east-1")
client.create_queue(QueueName="test-queue") q_resp = client.create_queue(QueueName="test-queue")
queue = sqs.Queue("test-queue") queue = sqs.Queue(q_resp["QueueUrl"])
body_one = "this is a test message" body_one = "this is a test message"
body_two = "this is another test message" body_two = "this is another test message"
@ -1862,8 +1861,8 @@ def test_delete_message_batch_with_duplicates():
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")
conn = boto3.client("sqs", region_name="us-east-1") conn = boto3.client("sqs", region_name="us-east-1")
conn.create_queue(QueueName="test-queue") q_resp = conn.create_queue(QueueName="test-queue")
queue = sqs.Queue("test-queue") queue = sqs.Queue(q_resp["QueueUrl"])
body_one = "this is a test message" body_one = "this is a test message"
@ -2918,12 +2917,40 @@ def test_fifo_send_message_when_same_group_id_is_in_dlq():
messages.should.have.length_of(1) messages.should.have.length_of(1)
@mock_sqs
def test_receive_message_should_not_accept_invalid_urls():
sqs = boto3.resource("sqs", region_name="us-east-1")
conn = boto3.client("sqs", region_name="us-east-1")
name = "test-queue"
q_response = conn.create_queue(QueueName=name)
working_url = q_response[
"QueueUrl"
] # https://queue.amazonaws.com/486285699788/test-queue
queue = sqs.Queue(name)
with pytest.raises(ClientError) as e:
queue.send_message(MessageBody="this is a test message")
err = e.value.response["Error"]
err["Code"].should.equal("InvalidAddress")
err["Message"].should.equal(
"The address test-queue is not valid for this endpoint."
)
with pytest.raises(ClientError) as e:
conn.receive_message(QueueUrl=name)
err = e.value.response["Error"]
err["Code"].should.equal("InvalidAddress")
err["Message"].should.equal(
"The address test-queue is not valid for this endpoint."
)
@mock_sqs @mock_sqs
def test_message_attributes_contains_trace_header(): def test_message_attributes_contains_trace_header():
sqs = boto3.resource("sqs", region_name="us-east-1") sqs = boto3.resource("sqs", region_name="us-east-1")
conn = boto3.client("sqs", region_name="us-east-1") conn = boto3.client("sqs", region_name="us-east-1")
conn.create_queue(QueueName="test-queue") q_resp = conn.create_queue(QueueName="test-queue")
queue = sqs.Queue("test-queue") queue = sqs.Queue(q_resp["QueueUrl"])
body_one = "this is a test message" body_one = "this is a test message"
queue.send_message( queue.send_message(