HttpServer.cs 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940
  1. using System;
  2. using System.Net;
  3. using System.Reactive.Linq;
  4. namespace MediaBrowser.Common.Net
  5. {
  6. public class HttpServer : IObservable<HttpListenerContext>, IDisposable
  7. {
  8. private readonly HttpListener _listener;
  9. private readonly IObservable<HttpListenerContext> _stream;
  10. public HttpServer(string url)
  11. {
  12. _listener = new HttpListener();
  13. _listener.Prefixes.Add(url);
  14. _listener.Start();
  15. _stream = ObservableHttpContext();
  16. }
  17. private IObservable<HttpListenerContext> ObservableHttpContext()
  18. {
  19. return Observable.Create<HttpListenerContext>(obs =>
  20. Observable.FromAsync(() => _listener.GetContextAsync())
  21. .Subscribe(obs))
  22. .Repeat()
  23. .Retry()
  24. .Publish()
  25. .RefCount();
  26. }
  27. public void Dispose()
  28. {
  29. _listener.Stop();
  30. }
  31. public IDisposable Subscribe(IObserver<HttpListenerContext> observer)
  32. {
  33. return _stream.Subscribe(observer);
  34. }
  35. }
  36. }