using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; using System.Net; using System.Web; using Amazon.SimpleNotificationService.Util; namespace WebSNSReceiver { /// /// Summary description for SNSReceiver /// public class SNSReceiver : IHttpHandler { public void ProcessRequest(HttpContext context) { if(context.Request.HttpMethod == "POST") { ProcessPost(context); } else if (context.Request.HttpMethod == "GET") { ProcessGet(context); } } private void ProcessGet(HttpContext context) { context.Response.ContentType = "text/plain"; var log = context.Application["log"] as IList; if (log == null) { context.Response.Write("No log messages"); } else { foreach (var message in log.Reverse()) { context.Response.Write(message + "\n"); } } } private void ProcessPost(HttpContext context) { string contentBody; using (StreamReader reader = new StreamReader(context.Request.InputStream)) contentBody = reader.ReadToEnd(); Message message = Message.ParseMessage(contentBody); if (!message.IsMessageSignatureValid()) throw new Exception("Amazon SNS Message signature is invalid"); if (message.IsSubscriptionType) { ConfirmSubscription(context, message); } else if (message.IsNotificationType) { ProcessNotification(context, message); } } private void ConfirmSubscription(HttpContext context, Message message) { if (!IsValidTopic(message.TopicArn)) return; try { message.SubscribeToTopic(); Trace.WriteLine(string.Format("Subscription to {0} confirmed.", message.TopicArn)); var log = context.Application["log"] as IList; if(log == null) { log = new List(); context.Application["log"] = log; } log.Add(string.Format("{0}: Confirmed subscription to {1}", DateTime.Now, message.TopicArn)); } catch(Exception e) { Trace.WriteLine(string.Format("Error confirming subscription to {0}: {1}", message.TopicArn, e.Message)); } } private bool IsValidTopic(string topicArn) { // Add whatever business logic needed to verify this is a topic that // should be subscribed. This could be checking the account ID in the // ARN for the topic. return true; } private void ProcessNotification(HttpContext context, Message message) { var log = context.Application["log"] as IList; if (log == null) { log = new List(); context.Application["log"] = log; } log.Add(string.Format("{0}: Received notification from {1} with message {2}", DateTime.Now, message.TopicArn, message.MessageText)); } public bool IsReusable { get { return false; } } } }