Skip to content

Commit

Permalink
fine tune template error messages
Browse files Browse the repository at this point in the history
  • Loading branch information
wxiaoguang committed Apr 8, 2023
1 parent bf6b92b commit 5f017a8
Show file tree
Hide file tree
Showing 4 changed files with 38 additions and 18 deletions.
8 changes: 4 additions & 4 deletions modules/context/context.go
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ import (

// Render represents a template render
type Render interface {
TemplateLookup(tmpl string) *template.Template
TemplateLookup(tmpl string) (*template.Template, error)
HTML(w io.Writer, status int, name string, data interface{}) error
}

Expand Down Expand Up @@ -228,7 +228,7 @@ func (ctx *Context) HTML(status int, name base.TplName) {
}
if err := ctx.Render.HTML(ctx.Resp, status, string(name), templates.BaseVars().Merge(ctx.Data)); err != nil {
if status == http.StatusInternalServerError && name == base.TplName("status/500") {
ctx.PlainText(http.StatusInternalServerError, "Unable to find status/500 template")
ctx.PlainText(http.StatusInternalServerError, "Unable to find HTML templates, the template system is not initialized, or Gitea can't find your template files")
return
}
if execErr, ok := err.(texttemplate.ExecError); ok {
Expand All @@ -247,7 +247,7 @@ func (ctx *Context) HTML(status int, name base.TplName) {
if errorTemplateName != string(name) {
filename += " (subtemplate of " + string(name) + ")"
}
err = fmt.Errorf("%w\nin template file %s:\n%s", err, filename, templates.GetLineFromTemplate(errorTemplateName, line, target, pos))
err = fmt.Errorf("failed to render %s, error: %w:\n%s", filename, err, templates.GetLineFromTemplate(errorTemplateName, line, target, pos))
} else {
filename, filenameErr := templates.GetAssetFilename("templates/" + execErr.Name + ".tmpl")
if filenameErr != nil {
Expand All @@ -256,7 +256,7 @@ func (ctx *Context) HTML(status int, name base.TplName) {
if execErr.Name != string(name) {
filename += " (subtemplate of " + string(name) + ")"
}
err = fmt.Errorf("%w\nin template file %s", err, filename)
err = fmt.Errorf("failed to render %s, error: %w", filename, err)
}
}
ctx.ServerError("Render failed", err)
Expand Down
23 changes: 20 additions & 3 deletions modules/templates/htmlrenderer.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ package templates
import (
"bytes"
"context"
"errors"
"fmt"
"html/template"
"io"
Expand All @@ -15,9 +16,11 @@ import (
"strconv"
"strings"
"sync/atomic"
texttemplate "text/template"

"code.gitea.io/gitea/modules/log"
"code.gitea.io/gitea/modules/setting"
"code.gitea.io/gitea/modules/util"
"code.gitea.io/gitea/modules/watcher"
)

Expand All @@ -34,18 +37,32 @@ type HTMLRender struct {
templates atomic.Pointer[template.Template]
}

var ErrTemplateNotInitialized = errors.New("template system is not initialized, check your log for errors")

func (h *HTMLRender) HTML(w io.Writer, status int, name string, data interface{}) error {
if respWriter, ok := w.(http.ResponseWriter); ok {
if respWriter.Header().Get("Content-Type") == "" {
respWriter.Header().Set("Content-Type", "text/html; charset=utf-8")
}
respWriter.WriteHeader(status)
}
return h.templates.Load().ExecuteTemplate(w, name, data)
t, err := h.TemplateLookup(name)
if err != nil {
return texttemplate.ExecError{Name: name, Err: err}
}
return t.Execute(w, data)
}

func (h *HTMLRender) TemplateLookup(t string) *template.Template {
return h.templates.Load().Lookup(t)
func (h *HTMLRender) TemplateLookup(name string) (*template.Template, error) {
tmpls := h.templates.Load()
if tmpls == nil {
return nil, ErrTemplateNotInitialized
}
tmpl := tmpls.Lookup(name)
if tmpl == nil {
return nil, util.ErrNotExist
}
return tmpl, nil
}

func (h *HTMLRender) CompileTemplates() error {
Expand Down
11 changes: 7 additions & 4 deletions routers/web/auth/oauth.go
Original file line number Diff line number Diff line change
Expand Up @@ -578,12 +578,15 @@ func GrantApplicationOAuth(ctx *context.Context) {

// OIDCWellKnown generates JSON so OIDC clients know Gitea's capabilities
func OIDCWellKnown(ctx *context.Context) {
t := ctx.Render.TemplateLookup("user/auth/oidc_wellknown")
t, err := ctx.Render.TemplateLookup("user/auth/oidc_wellknown")
if err != nil {
ctx.ServerError("unable to find template", err)
return
}
ctx.Resp.Header().Set("Content-Type", "application/json")
ctx.Data["SigningKey"] = oauth2.DefaultSigningKey
if err := t.Execute(ctx.Resp, ctx.Data); err != nil {
log.Error("%v", err)
ctx.Error(http.StatusInternalServerError)
if err = t.Execute(ctx.Resp, ctx.Data); err != nil {
ctx.ServerError("unable to execute template", err)
}
}

Expand Down
14 changes: 7 additions & 7 deletions routers/web/swagger_json.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,22 +4,22 @@
package web

import (
"net/http"

"code.gitea.io/gitea/modules/base"
"code.gitea.io/gitea/modules/context"
"code.gitea.io/gitea/modules/log"
)

// tplSwaggerV1Json swagger v1 json template
const tplSwaggerV1Json base.TplName = "swagger/v1_json"

// SwaggerV1Json render swagger v1 json
func SwaggerV1Json(ctx *context.Context) {
t := ctx.Render.TemplateLookup(string(tplSwaggerV1Json))
t, err := ctx.Render.TemplateLookup(string(tplSwaggerV1Json))
if err != nil {
ctx.ServerError("unable to find template", err)
return
}
ctx.Resp.Header().Set("Content-Type", "application/json")
if err := t.Execute(ctx.Resp, ctx.Data); err != nil {
log.Error("%v", err)
ctx.Error(http.StatusInternalServerError)
if err = t.Execute(ctx.Resp, ctx.Data); err != nil {
ctx.ServerError("unable to execute template", err)
}
}

0 comments on commit 5f017a8

Please sign in to comment.