From cef4e263b5ddb8308e8a9ae8270e71b8808a664f Mon Sep 17 00:00:00 2001 From: Harald Wolff Date: Mon, 2 Sep 2019 09:59:09 +0200 Subject: [PATCH] Implement Resource.FallBackResource --- BaseResource.cs | 9 ++++----- DirectoryResource.cs | 2 +- Resource.cs | 16 +++++++++++++++- ResourceApplication.cs | 12 ++++-------- 4 files changed, 24 insertions(+), 15 deletions(-) diff --git a/BaseResource.cs b/BaseResource.cs index 29d14fb..808eb6b 100644 --- a/BaseResource.cs +++ b/BaseResource.cs @@ -40,7 +40,10 @@ namespace ln.http.resources public override Resource GetResource(string name) { - return this.resources[name]; + if (this.resources.ContainsKey(name)) + return this.resources[name]; + + return GetFallBackResource(); } public override IEnumerable GetResources() @@ -54,10 +57,6 @@ namespace ln.http.resources } - - - - public virtual Resource CreateResource(string name) { throw new NotImplementedException(); diff --git a/DirectoryResource.cs b/DirectoryResource.cs index 6b16dc4..0134cdd 100644 --- a/DirectoryResource.cs +++ b/DirectoryResource.cs @@ -126,7 +126,7 @@ namespace ln.http.resources return resource; } - throw new KeyNotFoundException(); + return GetFallBackResource(); } public override IEnumerable GetResources() diff --git a/Resource.cs b/Resource.cs index c7eb99a..b71b20c 100644 --- a/Resource.cs +++ b/Resource.cs @@ -10,6 +10,8 @@ namespace ln.http.resources public Resource Container { get; protected set; } public Resource DefaultResource { get; set; } + public Resource FallBackResource { get; set; } + public virtual bool HandlesDispatching => false; public Resource(String name) @@ -66,7 +68,8 @@ namespace ln.http.resources foreach (Resource r in GetResources()) if (r.Name.Equals(name)) return r; - throw new KeyNotFoundException(); + + return GetFallBackResource(); } public abstract IEnumerable GetResources(); @@ -75,6 +78,17 @@ namespace ln.http.resources return this.GetResources().Where((x) => resourceType.IsInstanceOfType(x)); } + public virtual Resource GetFallBackResource() + { + if (FallBackResource != null) + return FallBackResource; + + if (Container != null) + return Container.GetFallBackResource(); + + throw new KeyNotFoundException(); + } + public virtual HttpResponse GetResponse(HttpRequest httpRequest, Queue pathStack) { return GetResponse(httpRequest); diff --git a/ResourceApplication.cs b/ResourceApplication.cs index ec15187..edded57 100644 --- a/ResourceApplication.cs +++ b/ResourceApplication.cs @@ -14,22 +14,18 @@ namespace ln.http.resources public override HttpResponse GetResponse(HttpRequest httpRequest) { - /* TODO: Implement Authentication here... */ - - 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)) - throw new KeyNotFoundException(); - + { + currentResource = currentResource.GetFallBackResource(); + break; + } currentResource = currentResource.GetResource(next); - - /* TODO: Implement Authorization hook here... */ } return currentResource.GetResponse(httpRequest,pathStack);