// /** // * 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.router { public class StaticRouter : 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 StaticRouter(HTTPServer httpServer) { _httpServer = httpServer; httpServer.AddRouter(this.Route); } public StaticRouter(HTTPServer httpServer, string path) :this(path) { _httpServer = httpServer; httpServer.AddRouter(this.Route); } public StaticRouter(string path) { if (!Directory.Exists(path)) throw new FileNotFoundException(); RootPath = path; AddIndex("index.html"); AddIndex("index.htm"); } 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; } } }