From 42b9f27c45d5c66ff78378ea55800b9828598d6e Mon Sep 17 00:00:00 2001 From: Azareal Date: Fri, 19 Apr 2019 19:34:16 +1000 Subject: [PATCH] Defer setting headers to renderTemplate to avoid wasting resources for JSON requests and for future optimisations. Error pages now use routes.renderTemplate bringing them in line with the other standard routes. Every route should use a renderTemplate function now instead of calling RunTmpl. Merged some pi and renderTemplate lines in routes to reduce the amount of vertical space used. --- common/errors.go | 15 +++++---------- common/routes_common.go | 4 ++-- extend/guilds/lib/guilds.go | 16 ++++------------ main.go | 6 ++++++ routes/account.go | 24 ++++++------------------ routes/common.go | 25 +++++++++++++++++++------ routes/forum_list.go | 3 +-- routes/misc.go | 16 +++------------- routes/moderate.go | 11 +---------- 9 files changed, 47 insertions(+), 73 deletions(-) diff --git a/common/errors.go b/common/errors.go index f0485dff..dd496282 100644 --- a/common/errors.go +++ b/common/errors.go @@ -129,7 +129,6 @@ func errorHeader(w http.ResponseWriter, user User, title string) *Header { header := DefaultHeader(w, user) header.Title = title header.Zone = "error" - prepResources(&user, header, header.Theme) return header } @@ -304,10 +303,7 @@ func LoginRequiredJS(w http.ResponseWriter, r *http.Request, user User) RouteErr func SecurityError(w http.ResponseWriter, r *http.Request, user User) RouteError { w.WriteHeader(403) pi := ErrorPage{errorHeader(w, user, phrases.GetErrorPhrase("security_error_title")), phrases.GetErrorPhrase("security_error_body")} - if RunPreRenderHook("pre_render_security_error", w, r, &user, &pi) { - return nil - } - err := pi.Header.Theme.RunTmpl("error", pi, w) + err := RenderTemplateAlias("error", "security_error", w, r, pi.Header, pi) if err != nil { LogError(err) } @@ -381,12 +377,11 @@ func writeJsonError(errmsg string, w http.ResponseWriter) { } func handleErrorTemplate(w http.ResponseWriter, r *http.Request, pi ErrorPage) { - // TODO: What to do about this hook? - if RunPreRenderHook("pre_render_error", w, r, &pi.Header.CurrentUser, &pi) { - return - } - err := pi.Header.Theme.RunTmpl("error", pi, w) + err := RenderTemplateAlias("error", "error", w, r, pi.Header, pi) if err != nil { LogError(err) } } + +// Alias of routes.renderTemplate +var RenderTemplateAlias func(tmplName string, hookName string, w http.ResponseWriter, r *http.Request, header *Header, pi interface{}) error \ No newline at end of file diff --git a/common/routes_common.go b/common/routes_common.go index c235d903..b4a1fbee 100644 --- a/common/routes_common.go +++ b/common/routes_common.go @@ -222,11 +222,11 @@ func userCheck(w http.ResponseWriter, r *http.Request, user *User) (header *Head header.StartedAt = time.Now() } - prepResources(user,header,theme) + //PrepResources(user,header,theme) return header, nil } -func prepResources(user *User, header *Header, theme *Theme) { +func PrepResources(user *User, header *Header, theme *Theme) { header.AddSheet(theme.Name + "/main.css") if len(theme.Resources) > 0 { diff --git a/extend/guilds/lib/guilds.go b/extend/guilds/lib/guilds.go index 77342aba..95747cec 100644 --- a/extend/guilds/lib/guilds.go +++ b/extend/guilds/lib/guilds.go @@ -11,6 +11,7 @@ import ( "strings" c "github.com/Azareal/Gosora/common" + "github.com/Azareal/Gosora/routes" ) // A blank list to fill out that parameter in Page for routes which don't use it @@ -189,11 +190,7 @@ func RouteGuildList(w http.ResponseWriter, r *http.Request, user c.User) c.Route } pi := ListPage{"Guild List", user, header, guildList} - err = header.Theme.RunTmpl("guilds_guild_list", pi, w) - if err != nil { - return c.InternalError(err, w, r) - } - return nil + return routes.RenderTemplate("guilds_guild_list", w, r, header, pi) } func MiddleViewGuild(w http.ResponseWriter, r *http.Request, user c.User) c.RouteError { @@ -231,12 +228,7 @@ func RouteCreateGuild(w http.ResponseWriter, r *http.Request, user c.User) c.Rou } CommonAreaWidgets(header) - pi := c.Page{header, tList, nil} - err := header.Theme.RunTmpl("guilds_create_guild", pi, w) - if err != nil { - return c.InternalError(err, w, r) - } - return nil + return routes.RenderTemplate("guilds_create_guild", w, r, header, c.Page{header, tList, nil}) } func RouteCreateGuildSubmit(w http.ResponseWriter, r *http.Request, user c.User) c.RouteError { @@ -384,7 +376,7 @@ func PreRenderViewForum(w http.ResponseWriter, r *http.Request, user *c.User, da guildItem := guildData.(*Guild) guildpi := Page{pi.Title, pi.Header, pi.ItemList, pi.Forum, guildItem, pi.Page, pi.LastPage} - err := header.Theme.RunTmpl("guilds_view_guild", guildpi, w) + err := routes.RenderTemplate("guilds_view_guild", w, r, header, guildpi) if err != nil { c.LogError(err) return false diff --git a/main.go b/main.go index 70e18256..fd9e43dc 100644 --- a/main.go +++ b/main.go @@ -27,6 +27,7 @@ import ( c "github.com/Azareal/Gosora/common" "github.com/Azareal/Gosora/common/counters" "github.com/Azareal/Gosora/common/phrases" + "github.com/Azareal/Gosora/routes" "github.com/Azareal/Gosora/query_gen" "github.com/fsnotify/fsnotify" "github.com/pkg/errors" @@ -41,6 +42,11 @@ type Globs struct { stmts *Stmts } +// Temporary alias for renderTemplate +func init() { + c.RenderTemplateAlias = routes.RenderTemplate +} + // Experimenting with a new error package here to try to reduce the amount of debugging we have to do // TODO: Dynamically register these items to avoid maintaining as much code here? func afterDBInit() (err error) { diff --git a/routes/account.go b/routes/account.go index c34d7ace..e7b84aea 100644 --- a/routes/account.go +++ b/routes/account.go @@ -28,8 +28,7 @@ func AccountLogin(w http.ResponseWriter, r *http.Request, user c.User, header *c return c.LocalError("You're already logged in.", w, r, user) } header.Title = phrases.GetTitlePhrase("login") - pi := c.Page{header, tList, nil} - return renderTemplate("login", w, r, header, pi) + return renderTemplate("login", w, r, header, c.Page{header, tList, nil}) } // TODO: Log failed attempted logins? @@ -160,16 +159,8 @@ func AccountLoginMFAVerify(w http.ResponseWriter, r *http.Request, user c.User, if !mfaVerifySession(provSession, signedSession, uid) { return c.LocalError("Invalid session", w, r, user) } - - pi := c.Page{header, tList, nil} - if c.RunPreRenderHook("pre_render_login_mfa_verify", w, r, &user, &pi) { - return nil - } - err = header.Theme.RunTmpl("login_mfa_verify", pi, w) - if err != nil { - return c.InternalError(err, w, r) - } - return nil + + return renderTemplate("login_mfa_verify", w, r, header, c.Page{header, tList, nil}) } func AccountLoginMFAVerifySubmit(w http.ResponseWriter, r *http.Request, user c.User) c.RouteError { @@ -202,8 +193,7 @@ func AccountRegister(w http.ResponseWriter, r *http.Request, user c.User, header } header.Title = phrases.GetTitlePhrase("register") header.LooseCSP = true - pi := c.Page{header, tList, nil} - return renderTemplate("register", w, r, header, pi) + return renderTemplate("register", w, r, header, c.Page{header, tList, nil}) } func isNumeric(data string) (numeric bool) { @@ -392,8 +382,7 @@ func AccountEdit(w http.ResponseWriter, r *http.Request, user c.User, header *c. //edit_password func AccountEditPassword(w http.ResponseWriter, r *http.Request, user c.User, header *c.Header) c.RouteError { accountEditHead("account_password", w, r, &user, header) - pi := c.Page{header, tList, nil} - return renderTemplate("account_own_edit_password", w, r, header, pi) + return renderTemplate("account_own_edit_password", w, r, header, c.Page{header, tList, nil}) } // TODO: Require re-authentication if the user hasn't logged in in a while @@ -759,8 +748,7 @@ func LevelList(w http.ResponseWriter, r *http.Request, user c.User, header *c.He levels[i] = c.LevelListItem{i, iScore, status, perc * 2} } - pi := c.LevelListPage{header, levels[1:]} - return renderTemplate("level_list", w, r, header, pi) + return renderTemplate("level_list", w, r, header, c.LevelListPage{header, levels[1:]}) } func Alerts(w http.ResponseWriter, r *http.Request, user c.User, header *c.Header) c.RouteError { diff --git a/routes/common.go b/routes/common.go index 02206004..d0b100dd 100644 --- a/routes/common.go +++ b/routes/common.go @@ -76,6 +76,20 @@ func doPush(w http.ResponseWriter, header *c.Header) { } func renderTemplate(tmplName string, w http.ResponseWriter, r *http.Request, header *c.Header, pi interface{}) c.RouteError { + return renderTemplate2(tmplName, tmplName, w, r, header, pi) +} + +func renderTemplate2(tmplName string, hookName string, w http.ResponseWriter, r *http.Request, header *c.Header, pi interface{}) c.RouteError { + err := renderTemplate3(tmplName, tmplName, w, r, header, pi) + if err != nil { + return c.InternalError(err, w, r) + } + return nil +} + +func renderTemplate3(tmplName string, hookName string, w http.ResponseWriter, r *http.Request, header *c.Header, pi interface{}) error { + c.PrepResources(&header.CurrentUser, header, header.Theme) + if header.CurrentUser.Loggedin { header.MetaDesc = "" header.OGDesc = "" @@ -98,12 +112,11 @@ func renderTemplate(tmplName string, w http.ResponseWriter, r *http.Request, hea if header.CurrentUser.IsAdmin { header.Elapsed1 = time.Since(header.StartedAt).String() } - if c.RunPreRenderHook("pre_render_"+tmplName, w, r, &header.CurrentUser, pi) { + if c.RunPreRenderHook("pre_render_"+hookName, w, r, &header.CurrentUser, pi) { return nil } - err := header.Theme.RunTmpl(tmplName, pi, w) - if err != nil { - return c.InternalError(err, w, r) - } - return nil + return header.Theme.RunTmpl(tmplName, pi, w) } + +// TODO: Rename renderTemplate to RenderTemplate instead of using this hack to avoid breaking things +var RenderTemplate = renderTemplate3 diff --git a/routes/forum_list.go b/routes/forum_list.go index 292bbb76..8d9c0d84 100644 --- a/routes/forum_list.go +++ b/routes/forum_list.go @@ -49,6 +49,5 @@ func ForumList(w http.ResponseWriter, r *http.Request, user c.User, header *c.He } } - pi := c.ForumsPage{header, forumList} - return renderTemplate("forums", w, r, header, pi) + return renderTemplate("forums", w, r, header, c.ForumsPage{header, forumList}) } diff --git a/routes/misc.go b/routes/misc.go index 22702440..016c5d9c 100644 --- a/routes/misc.go +++ b/routes/misc.go @@ -50,8 +50,7 @@ func StaticFile(w http.ResponseWriter, r *http.Request) { func Overview(w http.ResponseWriter, r *http.Request, user c.User, header *c.Header) c.RouteError { header.Title = phrases.GetTitlePhrase("overview") header.Zone = "overview" - pi := c.Page{header, tList, nil} - return renderTemplate("overview", w, r, header, pi) + return renderTemplate("overview", w, r, header, c.Page{header, tList, nil}) } func CustomPage(w http.ResponseWriter, r *http.Request, user c.User, header *c.Header, name string) c.RouteError { @@ -60,8 +59,7 @@ func CustomPage(w http.ResponseWriter, r *http.Request, user c.User, header *c.H page, err := c.Pages.GetByName(name) if err == nil { header.Title = page.Title - pi := c.CustomPagePage{header, page} - return renderTemplate("custom_page", w, r, header, pi) + return renderTemplate("custom_page", w, r, header, c.CustomPagePage{header, page}) } else if err != sql.ErrNoRows { return c.InternalError(err, w, r) } @@ -72,16 +70,8 @@ func CustomPage(w http.ResponseWriter, r *http.Request, user c.User, header *c.H } header.Title = phrases.GetTitlePhrase("page") - pi := c.Page{header, tList, nil} // TODO: Pass the page name to the pre-render hook? - if c.RunPreRenderHook("pre_render_tmpl_page", w, r, &user, &pi) { - return nil - } - err = header.Theme.RunTmpl("page_"+name, pi, w) - if err != nil { - return c.InternalError(err, w, r) - } - return nil + return renderTemplate2("page_"+name, "tmpl_page", w, r, header, c.Page{header, tList, nil}) } // TODO: Set the cookie domain diff --git a/routes/moderate.go b/routes/moderate.go index 785b7dde..88ca40ed 100644 --- a/routes/moderate.go +++ b/routes/moderate.go @@ -26,14 +26,5 @@ func IPSearch(w http.ResponseWriter, r *http.Request, user c.User, header *c.Hea if err != nil { return c.InternalError(err, w, r) } - - pi := c.IPSearchPage{header, userList, ip} - if c.RunPreRenderHook("pre_render_ip_search", w, r, &user, &pi) { - return nil - } - err = header.Theme.RunTmpl("ip_search", pi, w) - if err != nil { - return c.InternalError(err, w, r) - } - return nil + return renderTemplate("ip_search", w, r, header, c.IPSearchPage{header, userList, ip}) }