Skip to content

Instantly share code, notes, and snippets.

@thinkbeforecoding
Created July 21, 2011 15:03
Show Gist options
  • Save thinkbeforecoding/1097383 to your computer and use it in GitHub Desktop.
Save thinkbeforecoding/1097383 to your computer and use it in GitHub Desktop.
NodeSharp
using System;
using System.IO;
using System.Net;
using System.Reactive.Concurrency;
using System.Reactive.Disposables;
using System.Reactive.Linq;
namespace NodeSharp
{
class Program
{
private const string RequestTemplate =
@"<html>
<head><title>node#</title></head>
<body>
Hello from node#<br/>
Current time : {0}<br/>
</body>
</html>";
static void Main()
{
var listener = new HttpListener {Prefixes = {"http://+:80/NodeSharp/"}};
var observableListener = GetObservableListener(listener);
observableListener.Subscribe( c =>
{
using (var writer = new StreamWriter(c.Response.OutputStream))
writer.WriteLine(RequestTemplate, DateTime.Now.TimeOfDay);
}
);
Console.ReadKey();
}
private static IObservable<HttpListenerContext> GetObservableListener(HttpListener listener)
{
return Observable.Create<HttpListenerContext>(
observer =>
{
// start listener on subscription
listener.Start();
var getContextEvent =
Observable.FromAsyncPattern(
listener.BeginGetContext,
r => listener.EndGetContext(r));
Observable.Defer(getContextEvent) // observable from factory
.Repeat() // repeat once done
.ObserveOn(Scheduler.TaskPool) // execute query in taskpool thread
.Subscribe(observer);
return Disposable.Create(listener.Stop); // stop when unsubscribing
}
);
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment