static void processRequestResponse(object data)
{
var context = data as HttpListenerContext;
HttpListenerResponse response = context.Response;
Console.WriteLine("New request: " + context.Request.Url.ToString());
do
{
var memStream = new MemoryStream();
try
{
if (context.Request.Url.LocalPath.StartsWith("/listing"))
{
const string user_parameter = "?user=";
string queryFull = context.Request.Url.Query;
if (queryFull.StartsWith(user_parameter))
{
// remove the ?user= string then check it looks like a username
string potentialUsername = queryFull.Remove(0, user_parameter.Length);
if (potentialUsername.Length == 0)
{
break;
}
tracker.RequestReceived(potentialUsername, memStream);
}
}
else if (context.Request.Url.LocalPath.StartsWith("/cheevos"))
{
Cheevo.CheevosAsCSV(memStream);
}
else if (context.Request.Url.LocalPath.StartsWith("/users"))
{
tracker.ListUsersAsCSV(memStream);
}
else if (context.Request.Url.LocalPath.StartsWith("/nominate"))
{
byte ret = (byte)'F';
var queryFull = context.Request.Url.Query.Split(new[] { "?" }, StringSplitOptions.RemoveEmptyEntries);
if (queryFull.Length == 3)
{
string user = "";
string proposes = "";
int cheevo = -1;
const string userStr = "user=";
const string proposesStr = "proposes=";
const string cheevoStr = "cheevo=";
if (queryFull[0].StartsWith(userStr))
{
user = queryFull[0].Remove(0, userStr.Length);
}
if (queryFull[1].StartsWith(proposesStr))
{
proposes = queryFull[1].Remove(0, proposesStr.Length);
}
if (queryFull[2].StartsWith(cheevoStr))
{
var id = queryFull[2].Remove(0, cheevoStr.Length);
cheevo = int.Parse(id);
}
if (!string.IsNullOrEmpty(user) && !string.IsNullOrEmpty(proposes) && cheevo != -1)
{
if (tracker.ProposeCheevo(user, proposes, cheevo))
{
ret = (byte)'T';
}
}
}
memStream.WriteByte(ret);
}
}
catch (Exception)
{
}
var outData = memStream.ToArray();
context.Response.ContentLength64 = outData.Length;
context.Response.OutputStream.Write(outData, 0, outData.Length);
}
while (false);
context.Response.OutputStream.Close();
}