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;
}
}
}
}