Exemple #1
0
        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?"
            }))));
        }
Exemple #2
0
        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);
        }
Exemple #3
0
        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));
        }
Exemple #5
0
        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;
Exemple #11
0
 internal SimpleFileSystemViewOptions(RoutableOptions <TContext, TRequest, TResponse> options) : base(options)
 {
     AddSearchPath(Path.Combine(Directory.GetCurrentDirectory(), "views"));
     AddViewExtension(".html");
 }
Exemple #12
0
 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);
Exemple #13
0
 internal SimpleFunctionalViewOptions(RoutableOptions <TContext, TRequest, TResponse> options) : base(options)
 {
 }
Exemple #14
0
 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;
Exemple #16
0
 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();
 }
Exemple #17
0
 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;
 }
Exemple #19
0
 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);
Exemple #20
0
 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;
Exemple #28
0
        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);
        }