2012-07-12 06:55:27 +00:00
|
|
|
using System;
|
|
|
|
using System.Net;
|
|
|
|
using System.Reactive.Linq;
|
|
|
|
|
2012-07-21 18:39:47 +00:00
|
|
|
namespace MediaBrowser.Common.Net
|
2012-07-12 06:55:27 +00:00
|
|
|
{
|
2012-08-10 13:07:58 +00:00
|
|
|
public class HttpServer : IObservable<HttpListenerContext>, IDisposable
|
2012-07-12 06:55:27 +00:00
|
|
|
{
|
|
|
|
private readonly HttpListener listener;
|
2012-08-10 13:07:58 +00:00
|
|
|
private readonly IObservable<HttpListenerContext> stream;
|
2012-07-12 06:55:27 +00:00
|
|
|
|
|
|
|
public HttpServer(string url)
|
|
|
|
{
|
|
|
|
listener = new HttpListener();
|
|
|
|
listener.Prefixes.Add(url);
|
|
|
|
listener.Start();
|
|
|
|
stream = ObservableHttpContext();
|
|
|
|
}
|
|
|
|
|
2012-08-10 13:07:58 +00:00
|
|
|
private IObservable<HttpListenerContext> ObservableHttpContext()
|
2012-07-12 06:55:27 +00:00
|
|
|
{
|
2012-08-10 13:07:58 +00:00
|
|
|
return Observable.Create<HttpListenerContext>(obs =>
|
2012-08-18 17:01:09 +00:00
|
|
|
Observable.FromAsync<HttpListenerContext>(() => listener.GetContextAsync())
|
2012-07-12 06:55:27 +00:00
|
|
|
.Subscribe(obs))
|
|
|
|
.Repeat()
|
|
|
|
.Retry()
|
|
|
|
.Publish()
|
|
|
|
.RefCount();
|
|
|
|
}
|
|
|
|
public void Dispose()
|
|
|
|
{
|
|
|
|
listener.Stop();
|
|
|
|
}
|
|
|
|
|
2012-08-10 13:07:58 +00:00
|
|
|
public IDisposable Subscribe(IObserver<HttpListenerContext> observer)
|
2012-07-12 06:55:27 +00:00
|
|
|
{
|
|
|
|
return stream.Subscribe(observer);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|