public MyRouting(RoutableOptions <KestrelRoutableContext, KestrelRoutableRequest, KestrelRoutableResponse> options) : base(options) { // test people. var people = new[] { new { Name = "Mab" }, new { Name = "Mabel" }, new { Name = "Mabelle" }, new { Name = "Mable" }, new { Name = "Mada" }, new { Name = "Madalena" }, new { Name = "Madalyn" }, new { Name = "Maddalena" }, new { Name = "Maddi" }, new { Name = "Maddie" }, new { Name = "Maddy" }, new { Name = "Madel" }, new { Name = "Madelaine" }, new { Name = "Madeleine" }, new { Name = "Madelena" }, new { Name = "Madelene" }, new { Name = "Madelin" }, new { Name = "Madelina" }, new { Name = "Madeline" }, new { Name = "Madella" }, new { Name = "Madelle" }, new { Name = "Madelon" }, new { Name = "Madelyn" }, new { Name = "Madge" }, new { Name = "Madlen" }, new { Name = "Madlin" }, new { Name = "Madonna" }, new { Name = "Mady" }, new { Name = "Mae" }, new { Name = "Maegan" }, new { Name = "Mag" }, new { Name = "Magda" }, new { Name = "Magdaia" }, new { Name = "Magdalen" }, new { Name = "Magdalena" }, new { Name = "Magdalene" }, new { Name = "Maggee" }, new { Name = "Maggi" }, new { Name = "Maggie" }, new { Name = "Maggy" }, new { Name = "Mahala" }, new { Name = "Mahalia" }, new { Name = "Maia" }, new { Name = "Maible" }, new { Name = "Maiga" }, new { Name = "Maighdiln" }, new { Name = "Mair" }, new { Name = "Maire" }, new { Name = "Maisey" }, new { Name = "Maisie" }, new { Name = "Maitilde" }, new { Name = "Mala" }, new { Name = "Malanie" }, new { Name = "Malena" }, new { Name = "Malia" }, new { Name = "Malina" }, new { Name = "Malinda" }, new { Name = "Malinde" }, new { Name = "Malissa" }, new { Name = "Malissia" }, new { Name = "Mallissa" }, new { Name = "Mallorie" }, new { Name = "Mallory" }, new { Name = "Malorie" }, new { Name = "Malory" }, new { Name = "Malva" }, new { Name = "Malvina" }, new { Name = "Malynda" }, new { Name = "Mame" }, new { Name = "Mamie" }, new { Name = "Manda" }, new { Name = "Mandi" }, new { Name = "Mandie" }, new { Name = "Mandy" }, new { Name = "Manon" }, new { Name = "Manya" }, new { Name = "Mara" }, new { Name = "Marabel" }, new { Name = "Marcela" }, new { Name = "Marcelia" }, new { Name = "Marcella" } }; // write a file system view. Add(_ => _.Get("/").DoAsync(async(ctx, req, resp) => await resp.WriteViewAsync("index", new { SomeModelField = new { Nested = "Widget widget" }, People = people }))); Add(_ => _.Get("/no-model").DoAsync(async(ctx, req, resp) => await resp.WriteViewAsync("index"))); // test rendering parent-child views. Add(_ => _.Get("/parent").DoAsync(async(ctx, req, resp) => await resp.WriteViewAsync("parent"))); Add(_ => _.Get("/child").DoAsync(async(ctx, req, resp) => await resp.WriteViewAsync("child"))); Add(_ => _.Get("/loop-child").DoAsync(async(ctx, req, resp) => await resp.WriteViewAsync("loop-child"))); // write an embedded view Add(_ => _.Get("/embedded").DoAsync(async(ctx, req, resp) => await resp.WriteViewAsync("test/embed", new { SomeModelField = new { Nested = "Widget widget" }, People = people }))); Add(_ => _.Get("/test").Do((ctx, req, resp) => resp.Write("Hello World!"))); Add(_ => _.Post("/test").Try(OnTestPost)); Add(_ => _.Get("/json").Do((ctx, req, resp) => resp.Write(JObject.FromObject(new { Field1 = 1, Field2 = "string?" })))); }
internal override Task ResolveView(ResolveViewArgs resolveViewArgs) { if (resolveViewArgs.Success == true) { return(Task.CompletedTask); } var path = new[] { resolveViewArgs.Name } .SelectMany(pattern => ViewExtensions.Select(ext => $"{pattern}{ext}")) .SelectMany(pattern => SearchPaths.Select(searchPath => CombineAndRestrictPath(searchPath, pattern))) .Where(_ => File.Exists(_)) .FirstOrDefault(); if (path == null) { return(Task.CompletedTask); } if (RoutableOptions.TryGetMimeType(Path.GetExtension(path), out var mimeType) == false) { mimeType = DefaultMimeType; } resolveViewArgs.MimeType = mimeType; resolveViewArgs.LastModified = File.GetLastWriteTimeUtc(path); resolveViewArgs.GetStream = () => Task.FromResult <Stream>(File.OpenRead(path)); resolveViewArgs.Success = true; return(Task.CompletedTask); }
public static IServiceProvider GetApplicationServices(this RoutableOptions <KestrelRoutableContext, KestrelRoutableRequest, KestrelRoutableResponse> @this) { if (!(@this is KestrelRoutableOptions options)) { throw new InvalidOperationException("Incompatible implementation of RoutableOptions"); } return(options.ApplicationServices); }
public static Parser <Node <TContext, TRequest, TResponse> > GetParser(RoutableOptions <TContext, TRequest, TResponse> options, SimpleViewOptions <TContext, TRequest, TResponse> viewOptions) { var atSymbols = from at in Parse.Char('@').Many().Text() select(Node <TContext, TRequest, TResponse>) new ContentNode <TContext, TRequest, TResponse>(options, viewOptions, at); var contentSymbols = from before in Parse.CharExcept('@').Or(Parse.Char('\n')).Or(Parse.Char('\r')).Many().Text() select(Node <TContext, TRequest, TResponse>) new ContentNode <TContext, TRequest, TResponse>(options, viewOptions, before); return(atSymbols.Or(contentSymbols)); }
public SimpleFunctionalViewOptions <TContext, TRequest, TResponse> FileAsync(Func <string, Task <string> > resolver) { AsyncViewResolvers.Add(async args => { if (args.Success == true) { return; } var path = await resolver(args.Name); args.MimeType = RoutableOptions.TryGetMimeType(Path.GetExtension(path), out var mimeType) ? mimeType : DefaultMimeType; args.GetStream = () => Task.FromResult <Stream>(System.IO.File.OpenRead(path)); args.Success = true; }); return(this); }
internal override Task ResolveView(ResolveViewArgs resolveViewArgs) { if (resolveViewArgs.Success == true) { return(Task.CompletedTask); } // build list of path patterns. var name = resolveViewArgs.Name.Replace('/', '.').Replace('\\', '.'); var paths = ViewExtensions.Select(ext => $"{name}{ext}"); foreach (var search in SearchPaths.SelectMany(_ => _.Prefixes.Select(prefix => new { prefix = prefix, assembly = _.Assembly }))) { // search every path pattern. foreach (var path in paths) { var absolutePath = string.IsNullOrWhiteSpace(search.prefix) ? path : $"{search.prefix.TrimEnd('.')}.{path}"; var info = search.assembly.GetManifestResourceInfo(absolutePath); if (info == null) { continue; } // resolve mime type. if (RoutableOptions.TryGetMimeType(Path.GetExtension(path), out var mimeType) == false) { mimeType = DefaultMimeType; } // construct response. resolveViewArgs.MimeType = mimeType; resolveViewArgs.LastModified = DateTime.MinValue; // embedded resources will not ever change. resolveViewArgs.GetStream = () => Task.FromResult(search.assembly.GetManifestResourceStream(absolutePath)); resolveViewArgs.Success = true; return(Task.CompletedTask); } } // no matches. return(Task.CompletedTask); }
public static async Task <Template <TContext, TRequest, TResponse> > Find(RoutableOptions <TContext, TRequest, TResponse> options, string viewName) { if (options.TryGetFeatureOptions <List <SimpleViewOptions <TContext, TRequest, TResponse> > >(out var viewOptionsCollection) == false) { // use default options. viewOptionsCollection = new List <SimpleViewOptions <TContext, TRequest, TResponse> >() { new SimpleFileSystemViewOptions <TContext, TRequest, TResponse>(options) }; } foreach (var viewOptions in viewOptionsCollection) { // resolve view. var resolveViewArgs = new ResolveViewArgs { Name = viewName }; await viewOptions.ResolveView(resolveViewArgs); if (resolveViewArgs.Success == false) { continue; } // parse view source and return a template. using (var stream = await resolveViewArgs.GetStream()) using (var reader = new StreamReader(stream)) { try { var parser = new TemplateParser <TContext, TRequest, TResponse>(options, viewOptions); var template = parser.TryParse(viewName, resolveViewArgs.LastModified, await reader.ReadToEndAsync()); template.MimeType = resolveViewArgs.MimeType; return(template); } catch (Exception ex) { throw new SimpleViewParserException(viewName, ex); } } } throw new SimpleViewNotFoundException(viewName); }
public KestrelRouting(RoutableOptions <KestrelRoutableContext, KestrelRoutableRequest, KestrelRoutableResponse> options) : base(options) { }
public static Parser <Node <TContext, TRequest, TResponse> > GetParser(RoutableOptions <TContext, TRequest, TResponse> options, SimpleViewOptions <TContext, TRequest, TResponse> viewOptions) => from condOpen in Parse.Char('@').Then(_ => Parse.String("Model")) from prop in Parse.Char('.').Then(_ => Parse.LetterOrDigit.Many().Text()).Many() select new ModelNode <TContext, TRequest, TResponse>(options, viewOptions, string.Join(".", prop));
public ContentNode(RoutableOptions <TContext, TRequest, TResponse> options, SimpleViewOptions <TContext, TRequest, TResponse> viewOptions, string content) : base(options, viewOptions) => Content = content;
internal SimpleFileSystemViewOptions(RoutableOptions <TContext, TRequest, TResponse> options) : base(options) { AddSearchPath(Path.Combine(Directory.GetCurrentDirectory(), "views")); AddViewExtension(".html"); }
public static Parser <Node <TContext, TRequest, TResponse> > GetParser(RoutableOptions <TContext, TRequest, TResponse> options, SimpleViewOptions <TContext, TRequest, TResponse> viewOptions) => from node in Parse.Char('@').Then(_ => Parse.String("Child")) select new ChildNode <TContext, TRequest, TResponse>(options, viewOptions);
internal SimpleFunctionalViewOptions(RoutableOptions <TContext, TRequest, TResponse> options) : base(options) { }
public static Parser <Node <TContext, TRequest, TResponse> > GetParser(RoutableOptions <TContext, TRequest, TResponse> options, SimpleViewOptions <TContext, TRequest, TResponse> viewOptions) => from condOpen in Parse.Char('@').Then(_ => Parse.String("EndForEach")) select new EndForEachNode <TContext, TRequest, TResponse>(options, viewOptions);
public ParentNode(RoutableOptions <TContext, TRequest, TResponse> options, SimpleViewOptions <TContext, TRequest, TResponse> viewOptions, string viewName) : base(options, viewOptions) => ViewName = viewName;
internal Template(RoutableOptions <TContext, TRequest, TResponse> options, SimpleViewOptions <TContext, TRequest, TResponse> viewOptions, IEnumerable <Node <TContext, TRequest, TResponse> > nodes) { Options = options; ViewOptions = viewOptions; Nodes = nodes.ToList(); }
public Node(RoutableOptions <TContext, TRequest, TResponse> options, SimpleViewOptions <TContext, TRequest, TResponse> viewOptions) { Options = options; ViewOptions = viewOptions; }
public RenderContext(string viewName, RoutableOptions <TContext, TRequest, TResponse> options, SimpleViewOptions <TContext, TRequest, TResponse> viewOptions) { ViewName = viewName; Options = options; ViewOptions = viewOptions; }
public static Parser <Node <TContext, TRequest, TResponse> > GetParser(RoutableOptions <TContext, TRequest, TResponse> options, SimpleViewOptions <TContext, TRequest, TResponse> viewOptions) => from condOpen in Parse.Char('@').Then(_ => Parse.String("IfSet(")) from body in Parse.LetterOrDigit.Or(Parse.Char('.')).Many().Text() from condClose in Parse.Char(')') select new IfSetNode <TContext, TRequest, TResponse>(options, viewOptions, body);
public ChildNode(RoutableOptions <TContext, TRequest, TResponse> options, SimpleViewOptions <TContext, TRequest, TResponse> viewOptions) : base(options, viewOptions) { }
public ModelNode(RoutableOptions <TContext, TRequest, TResponse> options, SimpleViewOptions <TContext, TRequest, TResponse> viewOptions, string expression) : base(options, viewOptions) => Expression = expression;
public SimpleViewOptions(RoutableOptions <TContext, TRequest, TResponse> options) => RoutableOptions = options;
public static Parser <Node <TContext, TRequest, TResponse> > GetParser(RoutableOptions <TContext, TRequest, TResponse> options, SimpleViewOptions <TContext, TRequest, TResponse> viewOptions) => from condOpen in Parse.Char('@').Then(_ => Parse.String("Parent(")) from body in ViewNameParser from condClose in Parse.Char(')') select new ParentNode <TContext, TRequest, TResponse>(options, viewOptions, body);
public TemplateParser(RoutableOptions <TContext, TRequest, TResponse> options, SimpleViewOptions <TContext, TRequest, TResponse> viewOptions) { Options = options; ViewOptions = viewOptions; }
public DefaultRouting(RoutableOptions <KestrelRoutableContext, KestrelRoutableRequest, KestrelRoutableResponse> options) : base(options) { Logger = options.GetApplicationServices().GetRequiredService <ILoggerFactory>().CreateLogger <DefaultRouting>(); Add(route => route.Get("/").Do(OnIndex)); }
internal SimpleEmbeddedViewOptions(RoutableOptions <TContext, TRequest, TResponse> options) : base(options) { AddViewExtension(".html"); }
public CustomExpressionNode(RoutableOptions <TContext, TRequest, TResponse> options, SimpleViewOptions <TContext, TRequest, TResponse> viewOptions, CustomExpression <TContext, TRequest, TResponse> node) : base(options, viewOptions) => Node = node;
public static RoutableOptions <TContext, TRequest, TResponse> UseFileSystemViews <TContext, TRequest, TResponse>(this RoutableOptions <TContext, TRequest, TResponse> @this, Action <SimpleFileSystemViewOptions <TContext, TRequest, TResponse> > builder) where TContext : RoutableContext <TContext, TRequest, TResponse> where TRequest : RoutableRequest <TContext, TRequest, TResponse> where TResponse : RoutableResponse <TContext, TRequest, TResponse> { if (@this.TryGetFeatureOptions <List <SimpleViewOptions <TContext, TRequest, TResponse> > >(out var list) == false) { list = new List <SimpleViewOptions <TContext, TRequest, TResponse> >(); @this.SetFeatureOptions(list); } var featureOptions = new SimpleFileSystemViewOptions <TContext, TRequest, TResponse>(@this); builder(featureOptions); list.Add(featureOptions); return(@this); }