Rework to use HttpRouter

master
Harald Wolff 2019-11-26 12:21:23 +01:00
parent 009fd85949
commit dfab746fd2
4 changed files with 50 additions and 21 deletions

View File

@ -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; }

View File

@ -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<String> pathStack = new Queue<String>(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);
}
}
}

39
ResourceRouter.cs 100644
View File

@ -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<String> pathStack = new Queue<String>(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;
}
}
}

View File

@ -48,6 +48,7 @@
<Compile Include="collections\IEntityCollectionInterface.cs" />
<Compile Include="collections\EntityMapper.cs" />
<Compile Include="websocket\WebsocketResource.cs" />
<Compile Include="ResourceRouter.cs" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\ln.http\ln.http.csproj">