private async Task<HttpResponseMessage> HttpHandler(HttpRequestMessage request)
{
if (request.Method == HttpMethod.Post)
{
var recipient = this.recipients.Keys.FirstOrDefault(r => r.MessageReceivingEndpoint.AbsolutePath == request.RequestUri.AbsolutePath);
if (recipient != null)
{
var inbox = this.recipients[recipient];
var buffer = await request.Content.ReadAsByteArrayAsync();
inbox.Add(Tuple.Create(DateTime.UtcNow, buffer));
return new HttpResponseMessage();
}
}
else if (request.Method == HttpMethod.Get)
{
var recipient = this.recipients.Keys.FirstOrDefault(r => r.MessageReceivingEndpoint == request.RequestUri);
if (recipient != null)
{
var inbox = this.recipients[recipient];
var list = new IncomingList();
string locationBase = recipient.MessageReceivingEndpoint.AbsoluteUri + "/";
list.Items = new List<IncomingList.IncomingItem>();
for (int i = 0; i < inbox.Count; i++)
{
list.Items.Add(new IncomingList.IncomingItem { DatePostedUtc = inbox[i].Item1, Location = new Uri(locationBase + i) });
}
var serializer = new DataContractJsonSerializer(typeof(IncomingList));
var contentStream = new MemoryStream();
serializer.WriteObject(contentStream, list);
contentStream.Position = 0;
return new HttpResponseMessage { Content = new StreamContent(contentStream) };
}
recipient = this.recipients.Keys.FirstOrDefault(r => request.RequestUri.AbsolutePath.StartsWith(r.MessageReceivingEndpoint.AbsolutePath + "/"));
if (recipient != null)
{
var messageIndex = int.Parse(request.RequestUri.Segments[request.RequestUri.Segments.Length - 1]);
var message = this.recipients[recipient][messageIndex];
byte[] messageBuffer = message.Item2;
return new HttpResponseMessage { Content = new StreamContent(new MemoryStream(messageBuffer)) };
}
}
return null;
}
}