using System; using System.Collections.Generic; using System.Linq; using System.Reflection; using System.Threading.Tasks; using Tesses.WebServer; namespace Tesses.CMS { public class PathValueServer : Server { public IServer Server {get;set;} int paths; public PathValueServer(int paths=1) { Server = new NotFoundServer(); this.paths=paths; } public PathValueServer(IServer inner,int paths=1) { Server = inner; this.paths = paths; } public string GetValue(ServerContext ctx) { lock(kvps) { if(kvps.ContainsKey(ctx)) { return kvps[ctx]; } } return ""; } private void SetValue(ServerContext ctx,string val) { lock(kvps) { if(kvps.ContainsKey(ctx)) { kvps[ctx] = val; } else { kvps.Add(ctx,val); } } } private void RemoveValue(ServerContext ctx) { lock(kvps) { kvps.Remove(ctx); } } Dictionary kvps=new Dictionary(); public override async Task GetAsync(ServerContext ctx) { string[] path=ctx.UrlPath.Split(new char[]{'/'},System.StringSplitOptions.RemoveEmptyEntries); SetValue(ctx,string.Join("/",path.Take(paths))); ctx.UrlPath = $"/{string.Join("/",path.Skip(paths))}"; await Server.GetAsync(ctx); RemoveValue(ctx); } public override async Task OptionsAsync(ServerContext ctx) { string[] path=ctx.UrlPath.Split(new char[]{'/'},System.StringSplitOptions.RemoveEmptyEntries); SetValue(ctx,string.Join("/",path.Take(paths))); ctx.UrlPath = $"/{string.Join("/",path.Skip(paths))}"; await Server.OptionsAsync(ctx); RemoveValue(ctx); } public override async Task OtherAsync(ServerContext ctx) { string[] path=ctx.UrlPath.Split(new char[]{'/'},System.StringSplitOptions.RemoveEmptyEntries); SetValue(ctx,string.Join("/",path.Take(paths))); ctx.UrlPath = $"/{string.Join("/",path.Skip(paths))}"; await Server.OtherAsync(ctx); RemoveValue(ctx); } public override async Task PostAsync(ServerContext ctx) { string[] path=ctx.UrlPath.Split(new char[]{'/'},System.StringSplitOptions.RemoveEmptyEntries); SetValue(ctx,string.Join("/",path.Take(paths))); ctx.UrlPath = $"/{string.Join("/",path.Skip(paths))}"; await Server.PostAsync(ctx); RemoveValue(ctx); } public override async Task BeforeAsync(ServerContext ctx) { var urlPath = ctx.UrlPath; string[] path=ctx.UrlPath.Split(new char[]{'/'},System.StringSplitOptions.RemoveEmptyEntries); SetValue(ctx,string.Join("/",path.Take(paths))); ctx.UrlPath = $"/{string.Join("/",path.Skip(paths))}"; var r= await Server.BeforeAsync(ctx); ctx.UrlPath = urlPath; return r; } } }