private string RenderStaticPage(ViewPageRef markdownPage)
        {
            var template = ExecuteTemplate((object)null,
                                           markdownPage.PageName, markdownPage.Template);

            return(template.Result);
        }
        public void AddPage(ViewPageRef page)
        {
            try
            {
                TemplateProvider.QueuePageToCompile(page);
                AddViewPage(page);
            }
            catch (Exception ex)
            {
                HandleCompilationException(page, ex);
            }

            try
            {
                var templatePath = page.Template;
                if (page.Template == null)
                {
                    return;
                }

                if (MasterPageTemplates.ContainsKey(templatePath))
                {
                    return;
                }

                var templateFile     = VirtualPathProvider.GetFile(templatePath);
                var templateContents = GetPageContents(templateFile);
                AddTemplate(templatePath, templateContents);
            }
            catch (Exception ex)
            {
                Log.Error("Error compiling template " + page.Template + ": " + ex.Message, ex);
            }
        }
        public ViewPageRef AddTemplate(string templatePath, string templateContents)
        {
            var templateFile = VirtualPathProvider.GetFile(templatePath);
            var templateName = templateFile.Name.WithoutExtension();

            TemplateService templateService;

            if (!templateServices.TryGetValue(templateFile.Extension, out templateService))
            {
                throw new ConfigurationErrorsException(
                          "No BaseType registered with extension " + templateFile.Extension + " for template " + templateFile.Name);
            }

            var template = new ViewPageRef(this, templatePath, templateName, templateContents, RazorPageType.Template)
            {
                LastModified = templateFile.LastModified,
                Service      = templateService,
            };

            MasterPageTemplates.Add(templatePath, template);

            try
            {
                //template.Compile();
                TemplateProvider.QueuePageToCompile(template);
                return(template);
            }
            catch (Exception ex)
            {
                Log.Error("AddViewPage() template.Prepare(): " + ex.Message, ex);
                return(null);
            }
        }
        private void HandleCompilationException(ViewPageRef page, Exception ex)
        {
            var tcex = ex as TemplateCompilationException;

            if (page == null)
            {
                Log.Error("Error compiling Razor page", ex);
                if (tcex != null)
                {
                    Log.Error(tcex.Errors.Dump());
                }
                return;
            }

            if (tcex != null)
            {
                Log.Error("Error compiling page {0}".Fmt(page.Name));
                Log.Error(tcex.Errors.Dump());
            }

            var errorViewPage = new ErrorViewPage(this, ex)
            {
                Name     = page.Name,
                PageType = page.PageType,
                FilePath = page.FilePath,
            };

            errorViewPage.Compile();
            AddViewPage(errorViewPage);
            Log.Error("Razor AddViewPage() page.Prepare(): " + ex.Message, ex);
        }
        public void ReloadIfNeeeded(ViewPageRef razorPage)
        {
            if (razorPage == null || razorPage.FilePath == null || !WatchForModifiedPages)
            {
                return;
            }

            var latestPage = GetLatestPage(razorPage);

            if (latestPage.LastModified > razorPage.LastModified)
            {
                razorPage.Reload(GetPageContents(latestPage), latestPage.LastModified);
            }

            ViewPageRef template;

            if (razorPage.Template != null &&
                this.MasterPageTemplates.TryGetValue(razorPage.Template, out template))
            {
                latestPage = GetLatestPage(template);
                if (latestPage.LastModified > template.LastModified)
                {
                    template.Reload(GetPageContents(latestPage), latestPage.LastModified);
                }
            }
        }
        public bool ProcessRazorPage(IHttpRequest httpReq, ViewPageRef razorPage, object dto, IHttpResponse httpRes)
        {
            //Add extensible way to control caching
            //httpRes.AddHeaderLastModified(razorPage.GetLastModified());

            var razorTemplate = ExecuteTemplate(dto, razorPage.PageName, razorPage.Template, httpReq, httpRes);
            var html          = razorTemplate.Result;

            var htmlBytes = html.ToUtf8Bytes();

            //var hasBom = html.Contains((char)65279);
            //TODO: Replace sad hack replacing the BOM with whitespace (ASP.NET+Mono):
            for (var i = 0; i < htmlBytes.Length - 3; i++)
            {
                if (htmlBytes[i] == 0xEF && htmlBytes[i + 1] == 0xBB && htmlBytes[i + 2] == 0xBF)
                {
                    htmlBytes[i]     = (byte)' ';
                    htmlBytes[i + 1] = (byte)' ';
                    htmlBytes[i + 2] = (byte)' ';
                }
            }

            httpRes.OutputStream.Write(htmlBytes, 0, htmlBytes.Length);

            var disposable = razorTemplate as IDisposable;

            if (disposable != null)
            {
                disposable.Dispose();
            }
            httpRes.EndServiceStackRequest(skipHeaders: true);

            return(true);
        }
        private void AddViewPage(ViewPageRef page)
        {
            switch (page.PageType)
            {
            case RazorPageType.ViewPage:
                ViewPages.Add(page.Name, page);
                break;

            case RazorPageType.SharedViewPage:
                ViewSharedPages.Add(page.Name, page);
                break;

            case RazorPageType.ContentPage:
                ContentPages.Add(page.FilePath.WithoutExtension().TrimStart(DirSeps), page);
                break;
            }
        }
        private IVirtualFile GetLatestPage(ViewPageRef razorPage)
        {
            var file = VirtualPathProvider.GetFile(razorPage.FilePath);

            return(file);
        }
        public void Configure(IAppHost appHost)
        {
            this.AppHost = appHost;
            appHost.ViewEngines.Add(this);

            //Default to watching modfied pages in DebugMode
            if (!WatchForModifiedPages)
            {
                WatchForModifiedPages = appHost.Config.DebugMode;
            }

            //Default to parallel execution in DebugMode
            if (this.TemplateProvider.CompileInParallelWithNoOfThreads <= 0)
            {
                this.TemplateProvider.CompileInParallelWithNoOfThreads = appHost.Config.DebugMode
                    ? Environment.ProcessorCount * 2
                    : 0;
            }

            foreach (var ns in EndpointHostConfig.RazorNamespaces)
            {
                TemplateNamespaces.Add(ns);
            }

            this.ReplaceTokens = appHost.Config.HtmlReplaceTokens ?? new Dictionary <string, string>();
            var webHostUrl = appHost.Config.WebHostUrl;

            if (!webHostUrl.IsNullOrEmpty())
            {
                this.ReplaceTokens["~/"] = webHostUrl.WithTrailingSlash();
            }

            if (VirtualPathProvider == null)
            {
                VirtualPathProvider = AppHost.VirtualPathProvider;
            }

            Init();

            RegisterRazorPages(appHost.Config.WebHostPhysicalPath);

            appHost.CatchAllHandlers.Add((httpMethod, pathInfo, filePath) => {
                ViewPageRef razorPage = null;

                if (catchAllPathsNotFound.Contains(pathInfo))
                {
                    return(null);
                }

                razorPage = FindByPathInfo(pathInfo);

                if (WatchForModifiedPages)
                {
                    ReloadIfNeeeded(razorPage);
                }

                if (razorPage == null)
                {
                    foreach (var entry in RazorExtensionBaseTypes)
                    {
                        if (pathInfo.EndsWith("." + entry.Key))
                        {
                            pathInfo = pathInfo.EndsWith(DefaultPage + "." + entry.Key, StringComparison.InvariantCultureIgnoreCase)
                                ? pathInfo.Substring(0, pathInfo.Length - (DefaultPage + "." + entry.Key).Length)
                                : pathInfo.WithoutExtension();

                            return(new RedirectHttpHandler {
                                AbsoluteUrl = webHostUrl.IsNullOrEmpty()
                                    ? null
                                    : webHostUrl.CombineWith(pathInfo),
                                RelativeUrl = webHostUrl.IsNullOrEmpty()
                                    ? pathInfo
                                    : null
                            });
                        }
                    }

                    if (catchAllPathsNotFound.Count > 1000) //prevent DDOS
                    {
                        catchAllPathsNotFound = new HashSet <string>();
                    }

                    var tmp = new HashSet <string>(catchAllPathsNotFound)
                    {
                        pathInfo
                    };
                    catchAllPathsNotFound = tmp;
                    return(null);
                }

                return(new RazorHandler(pathInfo)
                {
                    RazorFormat = this,
                    RazorPage = razorPage,
                    RequestName = "RazorPage",
                });
            });
        }
Exemple #10
0
        public void Configure(IAppHost appHost)
        {
            this.AppHost = appHost;
            appHost.ViewEngines.Add(this);

            foreach (var ns in EndpointHostConfig.RazorNamespaces)
            {
                TemplateNamespaces.Add(ns);
            }

            this.ReplaceTokens = appHost.Config.HtmlReplaceTokens ?? new Dictionary <string, string>();
            var webHostUrl = appHost.Config.WebHostUrl;

            if (!webHostUrl.IsNullOrEmpty())
            {
                this.ReplaceTokens["~/"] = webHostUrl.WithTrailingSlash();
            }

            if (VirtualPathProvider == null)
            {
                VirtualPathProvider = AppHost.VirtualPathProvider;
            }

            Init();

            RegisterRazorPages(appHost.Config.WebHostPhysicalPath);

            appHost.CatchAllHandlers.Add((httpMethod, pathInfo, filePath) => {
                ViewPageRef razorPage = null;

                if (catchAllPathsNotFound.Contains(pathInfo))
                {
                    return(null);
                }

                razorPage = FindByPathInfo(pathInfo);

                if (WatchForModifiedPages)
                {
                    ReloadModifiedPageAndTemplates(razorPage);
                }

                if (razorPage == null)
                {
                    foreach (var entry in RazorExtensionBaseTypes)
                    {
                        if (pathInfo.EndsWith("." + entry.Key))
                        {
                            return(new RedirectHttpHandler {
                                AbsoluteUrl = webHostUrl.IsNullOrEmpty()
                                    ? null
                                    : webHostUrl.CombineWith(pathInfo.WithoutExtension()),
                                RelativeUrl = webHostUrl.IsNullOrEmpty()
                                    ? pathInfo.WithoutExtension()
                                    : null
                            });
                        }
                    }

                    if (catchAllPathsNotFound.Count > 1000) //prevent DDOS
                    {
                        catchAllPathsNotFound = new HashSet <string>();
                    }

                    var tmp = new HashSet <string>(catchAllPathsNotFound)
                    {
                        pathInfo
                    };
                    catchAllPathsNotFound = tmp;
                    return(null);
                }

                return(new RazorHandler(pathInfo)
                {
                    RazorFormat = this,
                    RazorPage = razorPage,
                    RequestName = "RazorPage",
                });
            });
        }