def return_response(self, method, path, data, headers, response): # persist requests to disk super(ProxyListenerSNS, self).return_response(method, path, data, headers, response) if method == "POST" and path == "/": # convert account IDs in ARNs data = aws_stack.fix_account_id_in_arns(data, colon_delimiter="%3A") aws_stack.fix_account_id_in_arns(response) # remove "None" strings from result search = r"<entry><key>[^<]+</key>\s*<value>\s*None\s*</[^>]+>\s*</entry>" response_regex_replace(response, search, "") # parse request and extract data req_data = parse_qs(to_str(data)) req_action = req_data["Action"][0] if req_action == "Subscribe" and response.status_code < 400: response_data = xmltodict.parse(response.content) topic_arn = (req_data.get("TargetArn") or req_data.get("TopicArn"))[0] filter_policy = (req_data.get("FilterPolicy") or [None])[0] attributes = get_subscribe_attributes(req_data) sub_arn = response_data["SubscribeResponse"][ "SubscribeResult"]["SubscriptionArn"] do_subscribe( topic_arn, req_data["Endpoint"][0], req_data["Protocol"][0], sub_arn, attributes, filter_policy, ) if req_action == "CreateTopic" and response.status_code < 400: response_data = xmltodict.parse(response.content) topic_arn = response_data["CreateTopicResponse"][ "CreateTopicResult"]["TopicArn"] # publish event event_publisher.fire_event( event_publisher.EVENT_SNS_CREATE_TOPIC, payload={"t": event_publisher.get_hash(topic_arn)}, ) if req_action == "DeleteTopic" and response.status_code < 400: # publish event topic_arn = (req_data.get("TargetArn") or req_data.get("TopicArn"))[0] event_publisher.fire_event( event_publisher.EVENT_SNS_DELETE_TOPIC, payload={"t": event_publisher.get_hash(topic_arn)}, )
def return_response(self, method, path, data, headers, response): # persist requests to disk super(ProxyListenerSNS, self).return_response( method, path, data, headers, response ) if method == 'POST' and path == '/': # convert account IDs in ARNs data = aws_stack.fix_account_id_in_arns(data, colon_delimiter='%3A') aws_stack.fix_account_id_in_arns(response) # remove "None" strings from result search = r'<entry><key>[^<]+</key>\s*<value>\s*None\s*</[^>]+>\s*</entry>' response_regex_replace(response, search, '') # parse request and extract data req_data = urlparse.parse_qs(to_str(data)) req_action = req_data['Action'][0] if req_action == 'Subscribe' and response.status_code < 400: response_data = xmltodict.parse(response.content) topic_arn = (req_data.get('TargetArn') or req_data.get('TopicArn'))[0] filter_policy = (req_data.get('FilterPolicy') or [None])[0] attributes = get_subscribe_attributes(req_data) sub_arn = response_data['SubscribeResponse']['SubscribeResult']['SubscriptionArn'] do_subscribe( topic_arn, req_data['Endpoint'][0], req_data['Protocol'][0], sub_arn, attributes, filter_policy ) if req_action == 'CreateTopic' and response.status_code < 400: response_data = xmltodict.parse(response.content) topic_arn = response_data['CreateTopicResponse']['CreateTopicResult']['TopicArn'] do_create_topic(topic_arn) # publish event event_publisher.fire_event( event_publisher.EVENT_SNS_CREATE_TOPIC, payload={'t': event_publisher.get_hash(topic_arn)} ) if req_action == 'DeleteTopic' and response.status_code < 400: # publish event topic_arn = (req_data.get('TargetArn') or req_data.get('TopicArn'))[0] event_publisher.fire_event( event_publisher.EVENT_SNS_DELETE_TOPIC, payload={'t': event_publisher.get_hash(topic_arn)} )