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__(
"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 (
EmptyBatchRequest,
InvalidAddress,
InvalidAttributeName,
MessageNotInflight,
ReceiptHandleIsInvalid,
@ -51,11 +52,14 @@ class SQSResponse(BaseResponse):
def _get_queue_name(self):
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:
# Fallback to reading from the URL
queue_name = self.path.split("/")[-1]
return queue_name
# Fallback to reading from the URL for botocore
return self.path.split("/")[-1]
def _get_validated_visibility_timeout(self, timeout=None):
"""

View File

@ -311,20 +311,15 @@ def test_get_queue_url_error_not_exists():
@mock_sqs
def test_get_nonexistent_queue():
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:
sqs.Queue("http://whatever-incorrect-queue-address").load()
ex = err.value
ex.operation_name.should.equal("GetQueueAttributes")
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
@ -633,8 +628,10 @@ def test_get_queue_with_prefix():
def test_delete_queue():
sqs = boto3.resource("sqs", region_name="us-east-1")
conn = boto3.client("sqs", region_name="us-east-1")
conn.create_queue(QueueName="test-queue", Attributes={"VisibilityTimeout": "3"})
queue = sqs.Queue("test-queue")
q_resp = conn.create_queue(
QueueName="test-queue", Attributes={"VisibilityTimeout": "3"}
)
queue = sqs.Queue(q_resp["QueueUrl"])
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():
sqs = boto3.resource("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.set_attributes(Attributes={"VisibilityTimeout": "45"})
queue = sqs.Queue("test-queue")
queue = sqs.Queue(q_resp["QueueUrl"])
queue.attributes["VisibilityTimeout"].should.equal("45")
@ -789,8 +788,8 @@ def test_set_queue_attribute():
def test_send_receive_message_without_attributes():
sqs = boto3.resource("sqs", region_name="us-east-1")
conn = boto3.client("sqs", region_name="us-east-1")
conn.create_queue(QueueName="test-queue")
queue = sqs.Queue("test-queue")
q_resp = conn.create_queue(QueueName="test-queue")
queue = sqs.Queue(q_resp["QueueUrl"])
body_one = "this is a 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():
sqs = boto3.resource("sqs", region_name="us-east-1")
conn = boto3.client("sqs", region_name="us-east-1")
conn.create_queue(QueueName="test-queue")
queue = sqs.Queue("test-queue")
q_resp = conn.create_queue(QueueName="test-queue")
queue = sqs.Queue(q_resp["QueueUrl"])
body_one = "this is a 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():
sqs = boto3.resource("sqs", region_name="us-east-1")
conn = boto3.client("sqs", region_name="us-east-1")
conn.create_queue(QueueName="test-queue")
queue = sqs.Queue("test-queue")
q_resp = conn.create_queue(QueueName="test-queue")
queue = sqs.Queue(q_resp["QueueUrl"])
body_one = "this is a 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")
with freeze_time("2015-01-01 12:00:00"):
conn.create_queue(QueueName="test-queue-visibility")
queue = sqs.Queue("test-queue-visibility")
q_resp = conn.create_queue(QueueName="test-queue-visibility")
queue = sqs.Queue(q_resp["QueueUrl"])
queue.send_message(MessageBody="derp")
messages = conn.receive_message(QueueUrl=queue.url)
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():
sqs = boto3.resource("sqs", region_name="us-east-1")
conn = boto3.client("sqs", region_name="us-east-1")
conn.create_queue(QueueName="test-queue")
queue = sqs.Queue("test-queue")
q_resp = conn.create_queue(QueueName="test-queue")
queue = sqs.Queue(q_resp["QueueUrl"])
response = queue.send_message(MessageBody="derp")
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):
sqs = boto3.resource("sqs", region_name="us-east-1")
client = boto3.client("sqs", region_name="us-east-1")
client.create_queue(QueueName="test-queue")
queue = sqs.Queue("test-queue")
q_resp = client.create_queue(QueueName="test-queue")
queue = sqs.Queue(q_resp["QueueUrl"])
body_one = "this is a 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():
sqs = boto3.resource("sqs", region_name="us-east-1")
conn = boto3.client("sqs", region_name="us-east-1")
conn.create_queue(QueueName="test-queue")
queue = sqs.Queue("test-queue")
q_resp = conn.create_queue(QueueName="test-queue")
queue = sqs.Queue(q_resp["QueueUrl"])
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)
@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
def test_message_attributes_contains_trace_header():
sqs = boto3.resource("sqs", region_name="us-east-1")
conn = boto3.client("sqs", region_name="us-east-1")
conn.create_queue(QueueName="test-queue")
queue = sqs.Queue("test-queue")
q_resp = conn.create_queue(QueueName="test-queue")
queue = sqs.Queue(q_resp["QueueUrl"])
body_one = "this is a test message"
queue.send_message(