Fix : SQS - Added support for attribute labels for send_message function (#3181)
* Fix : SQS - Added support for attribute labels for send_message function * Add integration test on receive message function * Add send message invalid datetype integration test and fix SQS MessageAttributesInvalid exceptions
This commit is contained in:
parent
126f5a5155
commit
97139d4253
5 changed files with 114 additions and 19 deletions
|
|
@ -16,11 +16,13 @@ class ReceiptHandleIsInvalid(RESTError):
|
|||
)
|
||||
|
||||
|
||||
class MessageAttributesInvalid(Exception):
|
||||
status_code = 400
|
||||
class MessageAttributesInvalid(RESTError):
|
||||
code = 400
|
||||
|
||||
def __init__(self, description):
|
||||
self.description = description
|
||||
super(MessageAttributesInvalid, self).__init__(
|
||||
"MessageAttributesInvalid", description
|
||||
)
|
||||
|
||||
|
||||
class QueueDoesNotExist(RESTError):
|
||||
|
|
|
|||
|
|
@ -87,7 +87,19 @@ class Message(BaseModel):
|
|||
struct_format = "!I".encode("ascii") # ensure it's a bytestring
|
||||
for name in sorted(self.message_attributes.keys()):
|
||||
attr = self.message_attributes[name]
|
||||
data_type = attr["data_type"]
|
||||
data_type_parts = attr["data_type"].split(".")
|
||||
data_type = data_type_parts[0]
|
||||
|
||||
if data_type not in [
|
||||
"String",
|
||||
"Binary",
|
||||
"Number",
|
||||
]:
|
||||
raise MessageAttributesInvalid(
|
||||
"The message attribute '{0}' has an invalid message attribute type, the set of supported type prefixes is Binary, Number, and String.".format(
|
||||
name[0]
|
||||
)
|
||||
)
|
||||
|
||||
encoded = utf8("")
|
||||
# Each part of each attribute is encoded right after it's
|
||||
|
|
@ -243,9 +255,7 @@ class Queue(BaseModel):
|
|||
|
||||
# Check some conditions
|
||||
if self.fifo_queue and not self.name.endswith(".fifo"):
|
||||
raise MessageAttributesInvalid(
|
||||
"Queue name must end in .fifo for FIFO queues"
|
||||
)
|
||||
raise InvalidParameterValue("Queue name must end in .fifo for FIFO queues")
|
||||
|
||||
@property
|
||||
def pending_messages(self):
|
||||
|
|
|
|||
|
|
@ -9,7 +9,6 @@ from six.moves.urllib.parse import urlparse
|
|||
from .exceptions import (
|
||||
EmptyBatchRequest,
|
||||
InvalidAttributeName,
|
||||
MessageAttributesInvalid,
|
||||
MessageNotInflight,
|
||||
ReceiptHandleIsInvalid,
|
||||
)
|
||||
|
|
@ -82,12 +81,7 @@ class SQSResponse(BaseResponse):
|
|||
request_url = urlparse(self.uri)
|
||||
queue_name = self._get_param("QueueName")
|
||||
|
||||
try:
|
||||
queue = self.sqs_backend.create_queue(
|
||||
queue_name, self.tags, **self.attribute
|
||||
)
|
||||
except MessageAttributesInvalid as e:
|
||||
return self._error("InvalidParameterValue", e.description)
|
||||
queue = self.sqs_backend.create_queue(queue_name, self.tags, **self.attribute)
|
||||
|
||||
template = self.response_template(CREATE_QUEUE_RESPONSE)
|
||||
return template.render(queue_url=queue.url(request_url))
|
||||
|
|
@ -225,10 +219,7 @@ class SQSResponse(BaseResponse):
|
|||
if len(message) > MAXIMUM_MESSAGE_LENGTH:
|
||||
return ERROR_TOO_LONG_RESPONSE, dict(status=400)
|
||||
|
||||
try:
|
||||
message_attributes = parse_message_attributes(self.querystring)
|
||||
except MessageAttributesInvalid as e:
|
||||
return e.description, dict(status=e.status_code)
|
||||
message_attributes = parse_message_attributes(self.querystring)
|
||||
|
||||
queue_name = self._get_queue_name()
|
||||
|
||||
|
|
|
|||
|
|
@ -34,7 +34,7 @@ def parse_message_attributes(querystring, base="", value_namespace="Value."):
|
|||
)
|
||||
|
||||
data_type_parts = data_type[0].split(".")
|
||||
if len(data_type_parts) > 2 or data_type_parts[0] not in [
|
||||
if data_type_parts[0] not in [
|
||||
"String",
|
||||
"Binary",
|
||||
"Number",
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue