HttpServer.cs 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. using System;
  2. using System.Net;
  3. using System.Reactive.Linq;
  4. namespace MediaBrowser.Controller.Net
  5. {
  6. public class HttpServer : IObservable<RequestContext>, IDisposable
  7. {
  8. private readonly HttpListener listener;
  9. private readonly IObservable<RequestContext> stream;
  10. public HttpServer(int port)
  11. : this("http://+:" + port + "/")
  12. {
  13. }
  14. public HttpServer(string url)
  15. {
  16. listener = new HttpListener();
  17. listener.Prefixes.Add(url);
  18. listener.Start();
  19. stream = ObservableHttpContext();
  20. }
  21. private IObservable<RequestContext> ObservableHttpContext()
  22. {
  23. return Observable.Create<RequestContext>(obs =>
  24. Observable.FromAsyncPattern<HttpListenerContext>(listener.BeginGetContext,
  25. listener.EndGetContext)()
  26. .Select(c => new RequestContext(c))
  27. .Subscribe(obs))
  28. .Repeat()
  29. .Retry()
  30. .Publish()
  31. .RefCount();
  32. }
  33. public void Dispose()
  34. {
  35. listener.Stop();
  36. }
  37. public IDisposable Subscribe(IObserver<RequestContext> observer)
  38. {
  39. return stream.Subscribe(observer);
  40. }
  41. }
  42. }