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 namespace ln.http.resources
{ {
public abstract class Resource public abstract class Resource : IHTTPResource
{ {
public Resource Container { get; protected set; } public Resource Container { get; protected set; }
public Resource DefaultResource { get; set; } public Resource DefaultResource { get; set; }

View File

@ -3,32 +3,21 @@ using System.Collections.Generic;
namespace ln.http.resources namespace ln.http.resources
{ {
public class ResourceApplication : HttpApplication public class ResourceApplication
{ {
public Resource RootResource { get; set; } 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 ResourceApplication(Resource rootResource)
public override HttpResponse GetResponse(HttpRequest httpRequest) :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\IEntityCollectionInterface.cs" />
<Compile Include="collections\EntityMapper.cs" /> <Compile Include="collections\EntityMapper.cs" />
<Compile Include="websocket\WebsocketResource.cs" /> <Compile Include="websocket\WebsocketResource.cs" />
<Compile Include="ResourceRouter.cs" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\ln.http\ln.http.csproj"> <ProjectReference Include="..\ln.http\ln.http.csproj">