diff --git a/Resource.cs b/Resource.cs index b71b20c..b78bd70 100644 --- a/Resource.cs +++ b/Resource.cs @@ -5,7 +5,7 @@ using System.Linq; namespace ln.http.resources { - public abstract class Resource + public abstract class Resource : IHTTPResource { public Resource Container { get; protected set; } public Resource DefaultResource { get; set; } diff --git a/ResourceApplication.cs b/ResourceApplication.cs index edded57..885edc2 100644 --- a/ResourceApplication.cs +++ b/ResourceApplication.cs @@ -3,32 +3,21 @@ using System.Collections.Generic; namespace ln.http.resources { - public class ResourceApplication : HttpApplication + public class ResourceApplication { public Resource RootResource { get; set; } + public HttpRouter HttpRouter { get; set; } - public ResourceApplication() + public ResourceApplication(Resource rootResource,HttpRouter httpRouter) { - RootResource = new BaseResource(""); + RootResource = rootResource; + HttpRouter = httpRouter ?? new ResourceRouter(this); } - - public override HttpResponse GetResponse(HttpRequest httpRequest) + public ResourceApplication(Resource rootResource) + :this(rootResource, null) { } + public ResourceApplication() + :this(new BaseResource("")) { - Resource currentResource = RootResource; - Queue pathStack = new Queue(httpRequest.URI.AbsolutePath.Split(new String[] { "/" }, StringSplitOptions.RemoveEmptyEntries)); - - while ((pathStack.Count > 0) && (!currentResource.HandlesDispatching)) - { - String next = pathStack.Dequeue(); - if (!currentResource.Contains(next)) - { - currentResource = currentResource.GetFallBackResource(); - break; - } - currentResource = currentResource.GetResource(next); - } - - return currentResource.GetResponse(httpRequest,pathStack); } } } diff --git a/ResourceRouter.cs b/ResourceRouter.cs new file mode 100644 index 0000000..094724c --- /dev/null +++ b/ResourceRouter.cs @@ -0,0 +1,39 @@ +using System; +using System.Collections.Generic; +namespace ln.http.resources +{ + public class ResourceRouter : HttpRouter + { + Resource rootResource; + ResourceApplication resourceApplication; + + public Resource RootResource => rootResource ?? resourceApplication.RootResource; + + public ResourceRouter(Resource rootResource) + { + this.rootResource = rootResource; + } + public ResourceRouter(ResourceApplication resourceApplication) + { + this.resourceApplication = resourceApplication; + } + + public override IHTTPResource FindResource(HttpRequest httpRequest) + { + Resource currentResource = RootResource; + Queue pathStack = new Queue(httpRequest.URI.AbsolutePath.Split(new String[] { "/" }, StringSplitOptions.RemoveEmptyEntries)); + + while ((pathStack.Count > 0) && (!currentResource.HandlesDispatching)) + { + String next = pathStack.Dequeue(); + if (!currentResource.Contains(next)) + { + return currentResource.GetFallBackResource(); + } + currentResource = currentResource.GetResource(next); + } + + return currentResource; + } + } +} diff --git a/ln.http.resources.csproj b/ln.http.resources.csproj index 343ddef..614731e 100644 --- a/ln.http.resources.csproj +++ b/ln.http.resources.csproj @@ -48,6 +48,7 @@ +