优化模板渲染

This commit is contained in:
ExplodingDragon
2025-04-15 20:11:13 +08:00
parent d71bc43916
commit 1fd4dc4ef0
7 changed files with 36 additions and 26 deletions

View File

@@ -52,13 +52,13 @@ func (c *Config) NewPageServerOptions() (*pkg.ServerOptions, error) {
if c.Page.DefaultBranch == "" {
c.Page.DefaultBranch = "gh-pages"
}
defaultErr := utils.NewTemplate(defaultErrPage)
defaultErr := utils.MustTemplate(defaultErrPage)
if c.Page.ErrUnknownPage != "" {
data, err := os.ReadFile(c.Page.ErrUnknownPage)
if err != nil {
return nil, errors.Wrapf(err, "failed to read file %s", string(data))
}
c.pageErrUnknown = utils.NewTemplate(c.Page.ErrUnknownPage)
c.pageErrUnknown = utils.MustTemplate(string(data))
} else {
c.pageErrUnknown = defaultErr
}
@@ -67,7 +67,7 @@ func (c *Config) NewPageServerOptions() (*pkg.ServerOptions, error) {
if err != nil {
return nil, errors.Wrapf(err, "failed to read file %s", c.Page.ErrNotFoundPage)
}
c.pageErrNotFound = utils.NewTemplate(string(data))
c.pageErrNotFound = utils.MustTemplate(string(data))
} else {
c.pageErrNotFound = defaultErr
}
@@ -97,6 +97,7 @@ func (c *Config) ErrorHandler(w http.ResponseWriter, r *http.Request, err error)
if errors.Is(err, os.ErrNotExist) {
w.WriteHeader(http.StatusNotFound)
if err = c.pageErrNotFound.Execute(w, utils.NewTemplateInject(r, map[string]any{
"UUID": r.Header.Get("Session-ID"),
"Error": err,
"Path": r.URL.Path,
"Code": 404,
@@ -106,6 +107,7 @@ func (c *Config) ErrorHandler(w http.ResponseWriter, r *http.Request, err error)
} else {
w.WriteHeader(http.StatusInternalServerError)
if err = c.pageErrUnknown.Execute(w, utils.NewTemplateInject(r, map[string]any{
"UUID": r.Header.Get("Session-ID"),
"Error": err,
"Path": r.URL.Path,
"Code": 500,

View File

@@ -12,6 +12,6 @@
{{ if eq .Code 404 }}<h1>404 Not Found</h1>{{ else }}<h1>500 Unknown Error</h1>{{ end }}
</div>
<hr>
<div style="text-align: center;">Gitea Pages</div>
<div style="text-align: center;">Gitea Pages/{{ .UUID }}</div>
</Body>
</html>

5
go.mod
View File

@@ -5,6 +5,9 @@ go 1.24.2
require (
code.gitea.io/sdk/gitea v0.21.0
github.com/alecthomas/units v0.0.0-20240927000941-0f3dac36c52b
github.com/go-task/slim-sprig/v3 v3.0.0
github.com/gobwas/glob v0.2.3
github.com/google/uuid v1.6.0
github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58
github.com/pkg/errors v0.9.1
github.com/stretchr/testify v1.10.0
@@ -17,8 +20,6 @@ require (
github.com/davecgh/go-spew v1.1.1 // indirect
github.com/davidmz/go-pageant v1.0.2 // indirect
github.com/go-fed/httpsig v1.1.0 // indirect
github.com/go-task/slim-sprig/v3 v3.0.0 // indirect
github.com/gobwas/glob v0.2.3 // indirect
github.com/hashicorp/go-version v1.7.0 // indirect
github.com/pmezard/go-difflib v1.0.0 // indirect
go.uber.org/multierr v1.11.0 // indirect

17
go.sum
View File

@@ -1,5 +1,3 @@
code.gitea.io/sdk/gitea v0.19.0 h1:8I6s1s4RHgzxiPHhOQdgim1RWIRcr0LVMbHBjBFXq4Y=
code.gitea.io/sdk/gitea v0.19.0/go.mod h1:IG9xZJoltDNeDSW0qiF2Vqx5orMWa7OhVWrjvrd5NpI=
code.gitea.io/sdk/gitea v0.21.0 h1:69n6oz6kEVHRo1+APQQyizkhrZrLsTLXey9142pfkD4=
code.gitea.io/sdk/gitea v0.21.0/go.mod h1:tnBjVhuKJCn8ibdyyhvUyxrR1Ca2KHEoTWoukNhXQPA=
github.com/42wim/httpsig v1.2.2 h1:ofAYoHUNs/MJOLqQ8hIxeyz2QxOz8qdSVvp3PX/oPgA=
@@ -17,8 +15,8 @@ github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1v
github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8=
github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y=
github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8=
github.com/hashicorp/go-version v1.6.0 h1:feTTfFNnjP967rlCxM/I9g701jU+RN74YKx2mOkIeek=
github.com/hashicorp/go-version v1.6.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY=
github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=
github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58 h1:onHthvaw9LFnH4t2DcNVpwGmV9E1BkGknEliJkfwQj0=
@@ -33,12 +31,12 @@ github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpE
github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk=
github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA=
github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=
go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=
go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=
go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8=
@@ -46,8 +44,6 @@ go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8=
golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U=
golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk=
golang.org/x/crypto v0.37.0 h1:kJNSjF/Xp7kU0iB2Z+9viTPMW4EqqsrywMXLJOOsXSE=
golang.org/x/crypto v0.37.0/go.mod h1:vg+k43peMZ0pUMhYmVAWysMK35e6ioLh3wB8ZCAfbVc=
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
@@ -55,14 +51,11 @@ golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA=
golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/sys v0.32.0 h1:s77OFDvIQeibCmezSnk/q6iAfkdiQaJi4VzroCFrN20=
golang.org/x/sys v0.32.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/term v0.27.0 h1:WP60Sv1nlK1T6SupCHbXzSaN0b9wUmsPoRS9b61A23Q=
golang.org/x/term v0.27.0/go.mod h1:iMsnZpn0cago0GOrHO2+Y7u7JPn5AylBrcoWkElMTSM=
golang.org/x/term v0.31.0 h1:erwDkOK1Msy6offm1mOgvspSkslFnIGsFnxOKoufg3o=
golang.org/x/term v0.31.0/go.mod h1:R4BeIy7D95HzImkxGkTW1UQTtP54tio2RyHz7PwK0aw=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=

View File

@@ -4,11 +4,8 @@ import (
"bytes"
"io"
"net/http"
"text/template"
"code.d7z.net/d7z-project/gitea-pages/pkg/utils"
sprig "github.com/go-task/slim-sprig/v3"
)
type GoTemplate struct{}
@@ -23,7 +20,8 @@ func (g GoTemplate) Render(w http.ResponseWriter, r *http.Request, input io.Read
return err
}
out := &bytes.Buffer{}
parse, err := template.New("tmpl").Funcs(sprig.FuncMap()).Option("missingkey=error").Parse(string(dataB))
parse, err := utils.NewTemplate(string(dataB))
if err != nil {
return err
}

View File

@@ -9,6 +9,8 @@ import (
"strconv"
"time"
"github.com/google/uuid"
"github.com/pkg/errors"
"go.uber.org/zap"
@@ -69,9 +71,11 @@ func NewPageServer(backend core.Backend, options ServerOptions) *Server {
}
func (s *Server) ServeHTTP(writer http.ResponseWriter, request *http.Request) {
sessionId, _ := uuid.NewRandom()
request.Header.Set("Session-ID", sessionId.String())
defer func() {
if e := recover(); e != nil {
zap.L().Error("panic!", zap.Any("error", e))
zap.L().Error("panic!", zap.Any("error", e), zap.Any("id", sessionId))
if err, ok := e.(error); ok {
s.options.DefaultErrorHandler(writer, request, err)
}
@@ -79,7 +83,7 @@ func (s *Server) ServeHTTP(writer http.ResponseWriter, request *http.Request) {
}()
err := s.Serve(writer, request)
if err != nil {
zap.L().Debug("错误请求", zap.Error(err), zap.Any("request", request.RequestURI))
zap.L().Debug("错误请求", zap.Error(err), zap.Any("request", request.RequestURI), zap.Any("id", sessionId))
s.options.DefaultErrorHandler(writer, request, err)
}
}

View File

@@ -27,6 +27,18 @@ func NewTemplateInject(r *http.Request, def map[string]any) map[string]any {
return def
}
func NewTemplate(data string) *template.Template {
return template.Must(template.New("err").Funcs(sprig.FuncMap()).Parse(data))
func MustTemplate(data string) *template.Template {
newTemplate, err := NewTemplate(data)
if err != nil {
panic(err)
}
return newTemplate
}
func NewTemplate(data string) (*template.Template, error) {
funcMap := sprig.FuncMap()
delete(funcMap, "env")
delete(funcMap, "expandenv")
t := template.New("tmpl").Funcs(funcMap)
return t.Parse(data)
}