示例#1
0
 def _process_sent_message(self, path, data, req_data, headers):
     queue_url = _queue_url(path, req_data, headers)
     queue_name = queue_url.rpartition('/')[2]
     message_body = req_data.get('MessageBody', [None])[0]
     message_attributes = format_message_attributes(req_data)
     lambda_api.process_sqs_message(queue_name, message_body,
                                    message_attributes)
示例#2
0
    def forward_request(self, method, path, data, headers):

        if method == 'POST' and path == '/':
            req_data = urlparse.parse_qs(to_str(data))
            if 'QueueName' in req_data:
                encoded_data = urlencode(req_data, doseq=True)
                request = Request(data=encoded_data,
                                  headers=headers,
                                  method=method)
                return request
            elif req_data.get('Action', [None])[0] == 'SendMessage':
                queue_url = req_data.get('QueueUrl', [None])[0]
                queue_name = queue_url[queue_url.rindex('/') + 1:]
                message_body = req_data.get('MessageBody', [None])[0]
                if lambda_api.process_sqs_message(message_body, queue_name):
                    # If an lambda was listening, do not add the message to the queue
                    new_response = Response()
                    new_response._content = SUCCESSFUL_SEND_MESSAGE_XML_TEMPLATE.format(
                        message_attr_hash=md5(data),
                        message_body_hash=md5(message_body),
                        message_id=str(uuid.uuid4()),
                    )
                    new_response.status_code = 200
                    return new_response

        return True
示例#3
0
def handle_send_message(queue_url, queue_name, message_body,
                        message_attributes):
    url = 'http://localhost:4576/queue/'
    attr = VALID_ATTRIBUTE_NAMES[-2]
    q = QUEUE_ATTRIBUTES.get(queue_url)
    if (q and q['RedrivePolicy']):
        rp = json.loads(q['RedrivePolicy'])
        max_msg = rp['maxReceiveCount']
        dl_queue_name = rp['deadLetterTargetArn'].rsplit(':')[-1]

        sqs_client = aws_stack.connect_to_service('sqs')
        no_of_msg = int(
            sqs_client.get_queue_attributes(
                QueueUrl=queue_url, AttributeNames=[attr])['Attributes'][attr])
        receipt_handle = None
        if no_of_msg:
            receipt_handle = sqs_client.receive_message(
                QueueUrl=queue_url,
                AttributeNames=['ALL'])['Messages'][0]['ReceiptHandle']
        queue_name = dl_queue_name if no_of_msg > max_msg else queue_name
        if no_of_msg > int(max_msg):
            message_attr = {
                "firstAttribute": {
                    "DataType": "String",
                    "StringValue": "hello world"
                },
                "secondAttribute": {
                    "DataType": "String",
                    "StringValue": "goodbye world"
                }
            }
            message_attributes = message_attr
            dl_queue_url = url + dl_queue_name
            sqs_client.send_message(QueueUrl=dl_queue_url,
                                    MessageBody=message_body,
                                    MessageAttributes=message_attributes)
            sqs_client.delete_message(QueueUrl=queue_url,
                                      ReceiptHandle=receipt_handle)

            return lambda_api.process_sqs_message(queue_name, message_body,
                                                  message_attributes)

    else:
        return lambda_api.process_sqs_message(queue_name, message_body,
                                              message_attributes)
示例#4
0
    def _send_message(self, path, data, req_data, headers):
        queue_url = self._queue_url(path, req_data, headers)
        queue_name = queue_url.rpartition('/')[2]
        message_body = req_data.get('MessageBody', [None])[0]
        message_attributes = self.format_message_attributes(req_data)

        process_result = lambda_api.process_sqs_message(
            message_body, message_attributes, queue_name)
        if process_result:
            # If a Lambda was listening, do not add the message to the queue
            new_response = Response()
            message_attr_hash = self.get_message_attributes_md5(req_data)
            new_response._content = SUCCESSFUL_SEND_MESSAGE_XML_TEMPLATE.format(
                message_attr_hash=message_attr_hash,
                message_body_hash=md5(message_body),
                message_id=str(uuid.uuid4()))
            new_response.status_code = 200
            return new_response
示例#5
0
    def forward_request(self, method, path, data, headers):
        req_data = self.parse_request_data(method, path, data)

        if req_data:
            if req_data.get('Action', [None])[0] == 'SendMessage':
                queue_url = req_data.get('QueueUrl',
                                         [path.partition('?')[0]])[0]
                queue_name = queue_url[queue_url.rindex('/') + 1:]
                message_body = req_data.get('MessageBody', [None])[0]
                message_attributes = self.format_message_attributes(req_data)
                region_name = extract_region_from_auth_header(headers)

                process_result = lambda_api.process_sqs_message(
                    message_body,
                    message_attributes,
                    queue_name,
                    region_name=region_name)
                if process_result:
                    # If a Lambda was listening, do not add the message to the queue
                    new_response = Response()
                    new_response._content = SUCCESSFUL_SEND_MESSAGE_XML_TEMPLATE.format(
                        message_attr_hash=md5(data),
                        message_body_hash=md5(message_body),
                        message_id=str(uuid.uuid4()))
                    new_response.status_code = 200
                    return new_response
            if 'QueueName' in req_data:
                encoded_data = urlencode(
                    req_data, doseq=True) if method == 'POST' else ''
                modified_url = None
                if method == 'GET':
                    base_path = path.partition('?')[0]
                    modified_url = '%s?%s' % (base_path,
                                              urlencode(req_data, doseq=True))
                request = Request(data=encoded_data,
                                  url=modified_url,
                                  headers=headers,
                                  method=method)
                return request

        return True
示例#6
0
    def _send_message(self, path, data, req_data, headers):
        queue_url = req_data.get('QueueUrl', [path.partition('?')[0]])[0]
        queue_name = queue_url[queue_url.rindex('/') + 1:]
        message_body = req_data.get('MessageBody', [None])[0]
        message_attributes = self.format_message_attributes(req_data)
        region_name = extract_region_from_auth_header(headers)

        process_result = lambda_api.process_sqs_message(
            message_body,
            message_attributes,
            queue_name,
            region_name=region_name)
        if process_result:
            # If a Lambda was listening, do not add the message to the queue
            new_response = Response()
            new_response._content = SUCCESSFUL_SEND_MESSAGE_XML_TEMPLATE.format(
                message_attr_hash=md5(data),
                message_body_hash=md5(message_body),
                message_id=str(uuid.uuid4()))
            new_response.status_code = 200
            return new_response
示例#7
0
def _process_sent_message(path, req_data, headers):
    queue_name = _queue_url(path, req_data, headers).rpartition('/')[2]

    lambda_api.process_sqs_message(queue_name)