Skip to content

Commit 5f017a8

Browse files
committedApr 8, 2023
fine tune template error messages
1 parent bf6b92b commit 5f017a8

File tree

4 files changed

+38
-18
lines changed

4 files changed

+38
-18
lines changed
 

‎modules/context/context.go

+4-4
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ import (
4747

4848
// Render represents a template render
4949
type Render interface {
50-
TemplateLookup(tmpl string) *template.Template
50+
TemplateLookup(tmpl string) (*template.Template, error)
5151
HTML(w io.Writer, status int, name string, data interface{}) error
5252
}
5353

@@ -228,7 +228,7 @@ func (ctx *Context) HTML(status int, name base.TplName) {
228228
}
229229
if err := ctx.Render.HTML(ctx.Resp, status, string(name), templates.BaseVars().Merge(ctx.Data)); err != nil {
230230
if status == http.StatusInternalServerError && name == base.TplName("status/500") {
231-
ctx.PlainText(http.StatusInternalServerError, "Unable to find status/500 template")
231+
ctx.PlainText(http.StatusInternalServerError, "Unable to find HTML templates, the template system is not initialized, or Gitea can't find your template files")
232232
return
233233
}
234234
if execErr, ok := err.(texttemplate.ExecError); ok {
@@ -247,7 +247,7 @@ func (ctx *Context) HTML(status int, name base.TplName) {
247247
if errorTemplateName != string(name) {
248248
filename += " (subtemplate of " + string(name) + ")"
249249
}
250-
err = fmt.Errorf("%w\nin template file %s:\n%s", err, filename, templates.GetLineFromTemplate(errorTemplateName, line, target, pos))
250+
err = fmt.Errorf("failed to render %s, error: %w:\n%s", filename, err, templates.GetLineFromTemplate(errorTemplateName, line, target, pos))
251251
} else {
252252
filename, filenameErr := templates.GetAssetFilename("templates/" + execErr.Name + ".tmpl")
253253
if filenameErr != nil {
@@ -256,7 +256,7 @@ func (ctx *Context) HTML(status int, name base.TplName) {
256256
if execErr.Name != string(name) {
257257
filename += " (subtemplate of " + string(name) + ")"
258258
}
259-
err = fmt.Errorf("%w\nin template file %s", err, filename)
259+
err = fmt.Errorf("failed to render %s, error: %w", filename, err)
260260
}
261261
}
262262
ctx.ServerError("Render failed", err)

‎modules/templates/htmlrenderer.go

+20-3
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ package templates
66
import (
77
"bytes"
88
"context"
9+
"errors"
910
"fmt"
1011
"html/template"
1112
"io"
@@ -15,9 +16,11 @@ import (
1516
"strconv"
1617
"strings"
1718
"sync/atomic"
19+
texttemplate "text/template"
1820

1921
"code.gitea.io/gitea/modules/log"
2022
"code.gitea.io/gitea/modules/setting"
23+
"code.gitea.io/gitea/modules/util"
2124
"code.gitea.io/gitea/modules/watcher"
2225
)
2326

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

40+
var ErrTemplateNotInitialized = errors.New("template system is not initialized, check your log for errors")
41+
3742
func (h *HTMLRender) HTML(w io.Writer, status int, name string, data interface{}) error {
3843
if respWriter, ok := w.(http.ResponseWriter); ok {
3944
if respWriter.Header().Get("Content-Type") == "" {
4045
respWriter.Header().Set("Content-Type", "text/html; charset=utf-8")
4146
}
4247
respWriter.WriteHeader(status)
4348
}
44-
return h.templates.Load().ExecuteTemplate(w, name, data)
49+
t, err := h.TemplateLookup(name)
50+
if err != nil {
51+
return texttemplate.ExecError{Name: name, Err: err}
52+
}
53+
return t.Execute(w, data)
4554
}
4655

47-
func (h *HTMLRender) TemplateLookup(t string) *template.Template {
48-
return h.templates.Load().Lookup(t)
56+
func (h *HTMLRender) TemplateLookup(name string) (*template.Template, error) {
57+
tmpls := h.templates.Load()
58+
if tmpls == nil {
59+
return nil, ErrTemplateNotInitialized
60+
}
61+
tmpl := tmpls.Lookup(name)
62+
if tmpl == nil {
63+
return nil, util.ErrNotExist
64+
}
65+
return tmpl, nil
4966
}
5067

5168
func (h *HTMLRender) CompileTemplates() error {

‎routers/web/auth/oauth.go

+7-4
Original file line numberDiff line numberDiff line change
@@ -578,12 +578,15 @@ func GrantApplicationOAuth(ctx *context.Context) {
578578

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

‎routers/web/swagger_json.go

+7-7
Original file line numberDiff line numberDiff line change
@@ -4,22 +4,22 @@
44
package web
55

66
import (
7-
"net/http"
8-
97
"code.gitea.io/gitea/modules/base"
108
"code.gitea.io/gitea/modules/context"
11-
"code.gitea.io/gitea/modules/log"
129
)
1310

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

1714
// SwaggerV1Json render swagger v1 json
1815
func SwaggerV1Json(ctx *context.Context) {
19-
t := ctx.Render.TemplateLookup(string(tplSwaggerV1Json))
16+
t, err := ctx.Render.TemplateLookup(string(tplSwaggerV1Json))
17+
if err != nil {
18+
ctx.ServerError("unable to find template", err)
19+
return
20+
}
2021
ctx.Resp.Header().Set("Content-Type", "application/json")
21-
if err := t.Execute(ctx.Resp, ctx.Data); err != nil {
22-
log.Error("%v", err)
23-
ctx.Error(http.StatusInternalServerError)
22+
if err = t.Execute(ctx.Resp, ctx.Data); err != nil {
23+
ctx.ServerError("unable to execute template", err)
2424
}
2525
}

0 commit comments

Comments
 (0)