HttpServer.cs 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. using System;
  2. using System.Net;
  3. using System.Reactive.Linq;
  4. namespace MediaBrowser.Common.Net
  5. {
  6. public class HttpServer : IObservable<RequestContext>, IDisposable
  7. {
  8. private readonly HttpListener listener;
  9. private readonly IObservable<RequestContext> 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<RequestContext> ObservableHttpContext()
  18. {
  19. return Observable.Create<RequestContext>(obs =>
  20. Observable.FromAsyncPattern<HttpListenerContext>(listener.BeginGetContext,
  21. listener.EndGetContext)()
  22. .Select(c => new RequestContext(c))
  23. .Subscribe(obs))
  24. .Repeat()
  25. .Retry()
  26. .Publish()
  27. .RefCount();
  28. }
  29. public void Dispose()
  30. {
  31. listener.Stop();
  32. }
  33. public IDisposable Subscribe(IObserver<RequestContext> observer)
  34. {
  35. return stream.Subscribe(observer);
  36. }
  37. }
  38. }