Skip to content

Instantly share code, notes, and snippets.

@follesoe
Created December 24, 2010 14:42
Show Gist options
  • Save follesoe/754299 to your computer and use it in GitHub Desktop.
Save follesoe/754299 to your computer and use it in GitHub Desktop.
Using protocol handlers as a ultra thin layer of integration
/// <summary>
/// Starts the Http Listener on a background thread.
/// </summary>
private void StartHttpListener()
{
if (HttpListener.IsSupported)
{
try
{
//Creates a HttpListener with two urls for RSS and HTML.
HttpListener listener = new HttpListener();
listener.Prefixes.Add("http://localhost:8080/taskfeed/");
listener.Prefixes.Add("http://localhost:8080/taskhtml/");
listener.Start();
while (true)
{
HttpListenerContext context = listener.GetContext();
HttpListenerRequest request = context.Request;
HttpListenerResponse response = context.Response;
//Checks if the user is requesting the HTML page or the RSS feed.
if (context.Request.RawUrl.EndsWith("feed"))
{
//Renders the RSS feed.
context.Response.ContentType = "application/xml";
XmlTextWriter xmlWriter = new XmlTextWriter(context.Response.OutputStream, Encoding.UTF8);
xmlWriter.WriteStartDocument();
xmlWriter.WriteStartElement("rss");
xmlWriter.WriteAttributeString("version", "2.0");
xmlWriter.WriteStartElement("channel");
xmlWriter.WriteElementString("title", "HelpDesk Application - Open Requests");
xmlWriter.WriteElementString("description", "An RSS feed of open HelpDesk Requests. Can be used by gadgets, feed readers etc.");
xmlWriter.WriteElementString("link", "http://localhost:8080/taskhtml/");
foreach (HelpDeskRequest hr in logic.RequestDatabase)
{
if (!hr.Closed)
{
xmlWriter.WriteStartElement("item");
xmlWriter.WriteElementString("guid", hr.ID.ToString());
xmlWriter.WriteElementString("title", hr.Subject);
xmlWriter.WriteElementString("link", "helpdesk://open?id=" + hr.ID.ToString());
xmlWriter.WriteElementString("pubDate", hr.Date.ToString("r"));
xmlWriter.WriteEndElement();
}
}
xmlWriter.WriteEndElement();
xmlWriter.WriteEndElement();
xmlWriter.WriteEndDocument();
xmlWriter.Flush();
xmlWriter.Close();
}
else
{
//Renders the HTML page.
context.Response.ContentType = "text/html";
StringBuilder sb = new StringBuilder();
sb.Append("<html><head><title>HelpDesk Application</title>");
sb.Append("<link rel='alternate' type='application/rss+xml' title='HelpDesk Request Feed' href='taskfeed' />");
sb.Append("<style>body { font-family: verdana; }</style></head><body>");
sb.Append("<h1 style='color: red;'>Open HelpDesk Requests</h1><ul>");
foreach (HelpDeskRequest openItem in logic.RequestDatabase.FindAll(delegate(HelpDeskRequest hr) { return !hr.Closed; }))
{
sb.Append(string.Format("<li><a href='helpdesk://open?id={0}'>{1}</a></li>", openItem.ID, openItem.Subject));
}
sb.Append("</ul><h1 style='color: green;'>Closed HelpDesk Requests</h1><ul>");
foreach (HelpDeskRequest closedItem in logic.RequestDatabase.FindAll(delegate(HelpDeskRequest hr) { return hr.Closed; }))
{
sb.Append(string.Format("<li><a href='helpdesk://open?id={0}'>{1}</a></li>", closedItem.ID, closedItem.Subject));
}
sb.Append("</ul></body></html>");
StreamWriter streamWriter = new StreamWriter(response.OutputStream);
streamWriter.WriteLine(sb.ToString());
streamWriter.Flush();
streamWriter.Dispose();
}
response.Close();
}
}
catch (Exception)
{
MessageBox.Show("Unable to start HttpHandler. Are you running this application as an administrator?", "Running as administrator?", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment