From 92eedcf291999629d1b8333cb2c7e15bc08e4b26 Mon Sep 17 00:00:00 2001 From: sodastsai Date: Sun, 30 Jul 2017 20:44:06 +0800 Subject: [PATCH] Send JSON message to HTTP endpoint of SNS By the documentation from AWS - http://docs.aws.amazon.com/sns/latest/dg/SendMessageToHttp.html , SNS would send messages to HTTP/HTTPS endpoint in JSON format. But current implementation of `moto` sends messages in form-data format. --- moto/sns/models.py | 2 +- tests/test_sns/test_publishing_boto3.py | 11 ++++++++++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/moto/sns/models.py b/moto/sns/models.py index 5289c8bcd..a6b6c3a52 100644 --- a/moto/sns/models.py +++ b/moto/sns/models.py @@ -84,7 +84,7 @@ class Subscription(BaseModel): sqs_backends[region].send_message(queue_name, message) elif self.protocol in ['http', 'https']: post_data = self.get_post_data(message, message_id) - requests.post(self.endpoint, data=post_data) + requests.post(self.endpoint, json=post_data) def get_post_data(self, message, message_id): return { diff --git a/tests/test_sns/test_publishing_boto3.py b/tests/test_sns/test_publishing_boto3.py index cda9fed60..00c9ac7e2 100644 --- a/tests/test_sns/test_publishing_boto3.py +++ b/tests/test_sns/test_publishing_boto3.py @@ -1,4 +1,7 @@ from __future__ import unicode_literals + +import json + from six.moves.urllib.parse import parse_qs import boto3 @@ -56,9 +59,15 @@ def test_publish_to_sqs_in_different_region(): @freeze_time("2013-01-01") @mock_sns def test_publish_to_http(): - responses.add( + def callback(request): + request.headers["Content-Type"].should.equal("application/json") + json.loads.when.called_with(request.body).should_not.throw(Exception) + return 200, {}, "" + + responses.add_callback( method="POST", url="http://example.com/foobar", + callback=callback, ) conn = boto3.client('sns', region_name='us-east-1')