using System; using System.Net; using System.Reactive.Linq; namespace MediaBrowser.Common.Net { public class HttpServer : IObservable, IDisposable { private readonly HttpListener listener; private readonly IObservable stream; public HttpServer(string url) { listener = new HttpListener(); listener.Prefixes.Add(url); listener.Start(); stream = ObservableHttpContext(); } private IObservable ObservableHttpContext() { return Observable.Create(obs => Observable.FromAsync(() => listener.GetContextAsync()) .Subscribe(obs)) .Repeat() .Retry() .Publish() .RefCount(); } public void Dispose() { listener.Stop(); } public IDisposable Subscribe(IObserver observer) { return stream.Subscribe(observer); } } }