diff --git a/webcontroller/file_viewer.go b/webcontroller/file_viewer.go index 814bf7f..e84050c 100644 --- a/webcontroller/file_viewer.go +++ b/webcontroller/file_viewer.go @@ -72,7 +72,7 @@ func (wc *WebController) serveFileViewer(w http.ResponseWriter, r *http.Request, inf, err := templateData.PixelAPI.GetFileInfo(id) if err != nil { if pixelapi.ErrIsServerError(err) { - wc.templates.Get().ExecuteTemplate(w, "500", templateData) + wc.templates.Run(w, r, "500", templateData) return } continue @@ -82,7 +82,7 @@ func (wc *WebController) serveFileViewer(w http.ResponseWriter, r *http.Request, if len(files) == 0 { w.WriteHeader(http.StatusNotFound) - wc.templates.Get().ExecuteTemplate(w, "file_not_found", templateData) + wc.templates.Run(w, r, "file_not_found", templateData) return } @@ -131,7 +131,7 @@ func (wc *WebController) serveFileViewer(w http.ResponseWriter, r *http.Request, templateName = "file_viewer_compat" } - err = wc.templates.Get().ExecuteTemplate(w, templateName, templateData) + err = wc.templates.Run(w, r, templateName, templateData) if err != nil && !util.IsNetError(err) { log.Error("Error executing template file_viewer: %s", err) } @@ -153,17 +153,17 @@ func (wc *WebController) serveListViewer(w http.ResponseWriter, r *http.Request, if err != nil { if apiErr, ok := err.(pixelapi.Error); ok && apiErr.Status == http.StatusNotFound { w.WriteHeader(http.StatusNotFound) - wc.templates.Get().ExecuteTemplate(w, "list_not_found", templateData) + wc.templates.Run(w, r, "list_not_found", templateData) } else { log.Error("API request error occurred: %s", err) w.WriteHeader(http.StatusInternalServerError) - wc.templates.Get().ExecuteTemplate(w, "500", templateData) + wc.templates.Run(w, r, "500", templateData) } return } if len(list.Files) == 0 { w.WriteHeader(http.StatusNotFound) - wc.templates.Get().ExecuteTemplate(w, "list_not_found", templateData) + wc.templates.Run(w, r, "list_not_found", templateData) return } @@ -195,7 +195,7 @@ func (wc *WebController) serveListViewer(w http.ResponseWriter, r *http.Request, templateName = "file_viewer_compat" } - err = wc.templates.Get().ExecuteTemplate(w, templateName, templateData) + err = wc.templates.Run(w, r, templateName, templateData) if err != nil && !util.IsNetError(err) { log.Error("Error executing template file_viewer: %s", err) } diff --git a/webcontroller/filesystem.go b/webcontroller/filesystem.go index 0460be4..cbf6fc8 100644 --- a/webcontroller/filesystem.go +++ b/webcontroller/filesystem.go @@ -19,7 +19,7 @@ func (wc *WebController) serveDirectory(w http.ResponseWriter, r *http.Request, w.Header().Set("X-Robots-Tag", "noindex, nofollow") if path == "" { - wc.templates.Get().ExecuteTemplate(w, "404", td) + wc.templates.Run(w, r, "404", td) return } @@ -35,7 +35,7 @@ func (wc *WebController) serveDirectory(w http.ResponseWriter, r *http.Request, wc.serveUnavailableForLegalReasons(w, r) } else { log.Error("Failed to get path: %s", err) - wc.templates.Get().ExecuteTemplate(w, "500", td) + wc.templates.Run(w, r, "500", td) } return } @@ -43,7 +43,7 @@ func (wc *WebController) serveDirectory(w http.ResponseWriter, r *http.Request, td.Title = fmt.Sprintf("%s ~ pixeldrain", node.Path[node.BaseIndex].Name) td.Other = node td.OGData = wc.metadataFromFilesystem(r, node) - err = wc.templates.Get().ExecuteTemplate(w, "filesystem", td) + err = wc.templates.Run(w, r, "filesystem", td) if err != nil && !util.IsNetError(err) { log.Error("Error executing template filesystem: %s", err) } diff --git a/webcontroller/misc.go b/webcontroller/misc.go index 88e9928..fdbcd3c 100644 --- a/webcontroller/misc.go +++ b/webcontroller/misc.go @@ -20,7 +20,7 @@ func (wc *WebController) serveShareXConfig(w http.ResponseWriter, r *http.Reques sess, err := templateData.PixelAPI.PostUserSession("sharex") if err != nil { log.Error("Failed to create user session: %s", err) - wc.templates.Get().ExecuteTemplate(w, "500", templateData) + wc.templates.Run(w, r, "500", templateData) return } diff --git a/webcontroller/templates.go b/webcontroller/templates.go index 3c6895b..d0d1107 100644 --- a/webcontroller/templates.go +++ b/webcontroller/templates.go @@ -4,6 +4,7 @@ import ( "encoding/base64" "fmt" "html/template" + "io" "net/http" "net/url" "os" @@ -199,12 +200,15 @@ func (tm *TemplateManager) ParseTemplates(silent bool) { tm.tpl = tpl } -// Get returns the templates, so they can be used to render views -func (tm *TemplateManager) Get() *template.Template { +// Run runs a template by name +func (tm *TemplateManager) Run(w io.Writer, r *http.Request, name string, data any) (err error) { if tm.debugModeEnabled { tm.ParseTemplates(true) } - return tm.tpl + if r.Method == "HEAD" { + return nil + } + return tm.tpl.ExecuteTemplate(w, name, data) } // Template functions. These can be called from within the template to execute diff --git a/webcontroller/user_account.go b/webcontroller/user_account.go index 2292197..1f9aa34 100644 --- a/webcontroller/user_account.go +++ b/webcontroller/user_account.go @@ -368,5 +368,5 @@ func (wc *WebController) serveEmailConfirm( td := wc.newTemplateData(w, r) td.Other = status - wc.templates.Get().ExecuteTemplate(w, "email_confirm", td) + wc.templates.Run(w, r, "email_confirm", td) } diff --git a/webcontroller/web_controller.go b/webcontroller/web_controller.go index 8d2bc78..05393ce 100644 --- a/webcontroller/web_controller.go +++ b/webcontroller/web_controller.go @@ -90,7 +90,7 @@ func New(r *httprouter.Router, prefix string, conf Config) (wc *WebController) { if conf.MaintenanceMode { r.NotFound = http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusServiceUnavailable) - wc.templates.Get().ExecuteTemplate(w, "maintenance", wc.newTemplateData(w, r)) + wc.templates.Run(w, r, "maintenance", wc.newTemplateData(w, r)) }) return wc } @@ -203,6 +203,11 @@ func New(r *httprouter.Router, prefix string, conf Config) (wc *WebController) { {GET, "theme.css", wc.themeHandler}, } { r.Handle(h.method, prefix+"/"+h.path, middleware(h.handler)) + + // Also support HEAD requests + if h.method == GET { + r.HEAD(prefix+"/"+h.path, middleware(h.handler)) + } } return wc @@ -243,7 +248,8 @@ func (wc *WebController) serveTemplate(tpl string, opts handlerOpts) httprouter. http.Redirect(w, r, "/login", http.StatusSeeOther) return } - err := wc.templates.Get().ExecuteTemplate(w, tpl, td) + + err := wc.templates.Run(w, r, tpl, td) if err != nil && !util.IsNetError(err) { log.Error("Error executing template '%s': %s", tpl, err) } @@ -265,7 +271,7 @@ func (wc *WebController) serveMarkdown(tpl string, opts handlerOpts) httprouter. // Execute the raw markdown template and save the result in a buffer var tplBuf bytes.Buffer - err = wc.templates.Get().ExecuteTemplate(&tplBuf, tpl, tpld) + err = wc.templates.Run(&tplBuf, r, tpl, tpld) if err != nil && !util.IsNetError(err) { log.Error("Error executing template '%s': %s", tpl, err) return @@ -314,7 +320,7 @@ func (wc *WebController) serveMarkdown(tpl string, opts handlerOpts) httprouter. tpld.Other = template.HTML(mdBuf.Bytes()) // Execute the wrapper template - err = wc.templates.Get().ExecuteTemplate(w, "markdown_wrapper", tpld) + err = wc.templates.Run(w, r, "markdown_wrapper", tpld) if err != nil && !util.IsNetError(err) { log.Error("Error executing template '%s': %s", tpl, err) } @@ -389,7 +395,7 @@ func (wc *WebController) serveForm( w.WriteHeader(http.StatusBadRequest) } - err := wc.templates.Get().ExecuteTemplate(w, "form_page", td) + err := wc.templates.Run(w, r, "form_page", td) if err != nil && !util.IsNetError(err) { log.Error("Error executing form page: %s", err) } @@ -399,17 +405,17 @@ func (wc *WebController) serveForm( func (wc *WebController) serveForbidden(w http.ResponseWriter, r *http.Request) { log.Debug("Forbidden: %s", r.URL) w.WriteHeader(http.StatusForbidden) - wc.templates.Get().ExecuteTemplate(w, "403", wc.newTemplateData(w, r)) + wc.templates.Run(w, r, "403", wc.newTemplateData(w, r)) } func (wc *WebController) serveNotFound(w http.ResponseWriter, r *http.Request) { log.Debug("Not Found: %s", r.URL) w.WriteHeader(http.StatusNotFound) - wc.templates.Get().ExecuteTemplate(w, "404", wc.newTemplateData(w, r)) + wc.templates.Run(w, r, "404", wc.newTemplateData(w, r)) } func (wc *WebController) serveUnavailableForLegalReasons(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusUnavailableForLegalReasons) - wc.templates.Get().ExecuteTemplate(w, "451", wc.newTemplateData(w, r)) + wc.templates.Run(w, r, "451", wc.newTemplateData(w, r)) } func (wc *WebController) getAPIKey(r *http.Request) (key string, err error) {