diff --git a/ln.http.tests/UnitTest1.cs b/ln.http.tests/UnitTest1.cs index d79a857..71eef86 100644 --- a/ln.http.tests/UnitTest1.cs +++ b/ln.http.tests/UnitTest1.cs @@ -26,8 +26,8 @@ namespace ln.http.tests HttpRouter testRouter = new HttpRouter(server); testRouter.Map(HttpMethod.ANY, "/controller/*", HttpRoutePriority.NORMAL, new TestApiController().Route); - StaticRouter staticRouter = new StaticRouter(AppContext.BaseDirectory); - testRouter.Map(HttpMethod.ANY, "/static/*", staticRouter.Route); + FileSystemRouter fileSystemRouter = new FileSystemRouter(AppContext.BaseDirectory); + testRouter.Map(HttpMethod.ANY, "/static/*", fileSystemRouter.Route); HttpListener.DefaultPort = 0; HttpListener httpListener = new HttpListener(server); diff --git a/ln.http/FileSystemRouter.cs b/ln.http/FileSystemRouter.cs new file mode 100644 index 0000000..2ec833c --- /dev/null +++ b/ln.http/FileSystemRouter.cs @@ -0,0 +1,92 @@ +// /** +// * File: FileSystemRouter.cs +// * Author: haraldwolff +// * +// * This file and it's content is copyrighted by the Author and / or copyright holder. +// * Any use wihtout proper permission is illegal and may lead to legal actions. +// * +// * +// **/ +using System; +using System.IO; +using System.Collections.Generic; +using ln.http.mime; + +namespace ln.http +{ + public class FileSystemRouter : IDisposable + { + private string _rootPath; + public String RootPath + { + get => _rootPath; + private set + { + _rootPath = Path.GetFullPath(value); + } + } + + List indexNames = new List(); + public String[] IndexNames => indexNames.ToArray(); + + private HttpServer _httpServer; + + public FileSystemRouter(HttpServer httpServer, string path) + { + _httpServer = httpServer; + httpServer?.AddRouter(this.Route); + + if (!Directory.Exists(path)) + throw new FileNotFoundException(); + + RootPath = path; + Console.Error.WriteLine("FileSystemRouter created ({0})", RootPath); + + AddIndex("index.html"); + AddIndex("index.htm"); + } + public FileSystemRouter(string path) + :this(null, path) + { + } + + public void AddIndex(string indexName) => indexNames.Add(indexName); + public void RemoveIndex(string indexName) => indexNames.Remove(indexName); + + public bool Route(HttpContext httpContext) + { + string finalPath = httpContext.RoutableUri.Length > 0 ? Path.Combine(RootPath, httpContext.RoutableUri.Substring(1)) : "."; + + if (Directory.Exists(finalPath)) + { + foreach (string indexName in indexNames) + { + string indexFileName = Path.Combine(finalPath, indexName); + if (File.Exists(indexFileName)) + { + finalPath = indexFileName; + break; + } + } + } + + if (File.Exists(finalPath)) + { + lock (this) + { + httpContext.Response = new HttpResponse(httpContext.Request, new FileStream(finalPath, FileMode.Open, FileAccess.Read)); + httpContext.Response.SetHeader("content-type", MimeTypeMap.GetMimeType(Path.GetExtension(finalPath))); + return true; + } + } + return false; + } + + public void Dispose() + { + _httpServer?.RemoveRouter(this.Route); + _httpServer = null; + } + } + +} diff --git a/ln.http/ln.http.csproj b/ln.http/ln.http.csproj index e6c207e..1e7ad18 100644 --- a/ln.http/ln.http.csproj +++ b/ln.http/ln.http.csproj @@ -10,7 +10,7 @@ (c) 2020 Harald Wolff-Thobaben http server 9 - 0.6.2 + 0.6.4 0.6.2.0