aboutsummaryrefslogtreecommitdiff
path: root/MediaBrowser.Common
diff options
context:
space:
mode:
Diffstat (limited to 'MediaBrowser.Common')
-rw-r--r--MediaBrowser.Common/Kernel/BaseKernel.cs32
-rw-r--r--MediaBrowser.Common/Net/Handlers/BaseHandler.cs8
-rw-r--r--MediaBrowser.Common/Net/Handlers/StaticFileHandler.cs9
3 files changed, 43 insertions, 6 deletions
diff --git a/MediaBrowser.Common/Kernel/BaseKernel.cs b/MediaBrowser.Common/Kernel/BaseKernel.cs
index 1139fecb9..a4fa91976 100644
--- a/MediaBrowser.Common/Kernel/BaseKernel.cs
+++ b/MediaBrowser.Common/Kernel/BaseKernel.cs
@@ -1,5 +1,6 @@
using MediaBrowser.Common.Logging;
using MediaBrowser.Common.Net;
+using MediaBrowser.Common.Net.Handlers;
using MediaBrowser.Common.Plugins;
using MediaBrowser.Common.Serialization;
using MediaBrowser.Model.Configuration;
@@ -36,11 +37,22 @@ namespace MediaBrowser.Common.Kernel
public IEnumerable<BasePlugin> Plugins { get; private set; }
/// <summary>
+ /// Gets the list of currently registered http handlers
+ /// </summary>
+ [ImportMany(typeof(BaseHandler))]
+ private IEnumerable<BaseHandler> HttpHandlers { get; set; }
+
+ /// <summary>
/// Both the UI and server will have a built-in HttpServer.
/// People will inevitably want remote control apps so it's needed in the UI too.
/// </summary>
public HttpServer HttpServer { get; private set; }
+ /// <summary>
+ /// This subscribes to HttpListener requests and finds the appropate BaseHandler to process it
+ /// </summary>
+ private IDisposable HttpListener { get; set; }
+
protected virtual string HttpServerUrlPrefix
{
get
@@ -186,6 +198,21 @@ namespace MediaBrowser.Common.Kernel
DisposeHttpServer();
HttpServer = new HttpServer(HttpServerUrlPrefix);
+
+ HttpListener = HttpServer.Subscribe((ctx) =>
+ {
+ BaseHandler handler = HttpHandlers.FirstOrDefault(h => h.HandlesRequest(ctx.Request));
+
+ // Find the appropiate http handler
+ if (handler != null)
+ {
+ // Need to create a new instance because handlers are currently stateful
+ handler = Activator.CreateInstance(handler.GetType()) as BaseHandler;
+
+ // No need to await this, despite the compiler warning
+ handler.ProcessRequest(ctx);
+ }
+ });
}
/// <summary>
@@ -249,6 +276,11 @@ namespace MediaBrowser.Common.Kernel
{
HttpServer.Dispose();
}
+
+ if (HttpListener != null)
+ {
+ HttpListener.Dispose();
+ }
}
/// <summary>
diff --git a/MediaBrowser.Common/Net/Handlers/BaseHandler.cs b/MediaBrowser.Common/Net/Handlers/BaseHandler.cs
index 0a0f040de..ecc58b316 100644
--- a/MediaBrowser.Common/Net/Handlers/BaseHandler.cs
+++ b/MediaBrowser.Common/Net/Handlers/BaseHandler.cs
@@ -1,4 +1,5 @@
-using System;
+using MediaBrowser.Common.Logging;
+using System;
using System.Collections;
using System.Collections.Generic;
using System.Collections.Specialized;
@@ -6,15 +7,14 @@ using System.IO;
using System.IO.Compression;
using System.Linq;
using System.Net;
-using System.Text;
using System.Threading.Tasks;
-using System.Web;
-using MediaBrowser.Common.Logging;
namespace MediaBrowser.Common.Net.Handlers
{
public abstract class BaseHandler
{
+ public abstract bool HandlesRequest(HttpListenerRequest request);
+
private Stream CompressedStream { get; set; }
public virtual bool? UseChunkedEncoding
diff --git a/MediaBrowser.Common/Net/Handlers/StaticFileHandler.cs b/MediaBrowser.Common/Net/Handlers/StaticFileHandler.cs
index 884e398bf..bc367403b 100644
--- a/MediaBrowser.Common/Net/Handlers/StaticFileHandler.cs
+++ b/MediaBrowser.Common/Net/Handlers/StaticFileHandler.cs
@@ -1,15 +1,20 @@
-using System;
+using MediaBrowser.Common.Logging;
+using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Threading.Tasks;
-using MediaBrowser.Common.Logging;
namespace MediaBrowser.Common.Net.Handlers
{
public class StaticFileHandler : BaseHandler
{
+ public override bool HandlesRequest(HttpListenerRequest request)
+ {
+ return false;
+ }
+
private string _Path;
public virtual string Path
{