From 6e22a75e917a2320f40f40673f7671059ac45a14 Mon Sep 17 00:00:00 2001 From: Alexander Do Date: Sun, 7 Jun 2020 10:27:47 -0700 Subject: [PATCH 1/2] fix ctx.Render when using Go Templates --- ctx.go | 12 ++---------- ctx_test.go | 18 ++++++++++++++++++ 2 files changed, 20 insertions(+), 10 deletions(-) diff --git a/ctx.go b/ctx.go index 2f5abcf0..99137aa0 100644 --- a/ctx.go +++ b/ctx.go @@ -12,7 +12,6 @@ import ( "errors" "fmt" "io" - "io/ioutil" "log" "mime/multipart" "net/http" @@ -751,15 +750,8 @@ func (ctx *Ctx) Render(name string, bind interface{}) (err error) { } } else { // Render raw template using 'name' as filepath if no engine is set - var tmpl *template.Template - var raw []byte - // Read file - if raw, err = ioutil.ReadFile(filepath.Clean(name)); err != nil { - return err - } - // Parse template - // tmpl, err := template.ParseGlob(name) - if tmpl, err = template.New("").ParseGlob(getString(raw)); err != nil { + tmpl, err := template.ParseFiles(filepath.Clean(name)) + if err != nil { return err } // Render template diff --git a/ctx_test.go b/ctx_test.go index 8a1597a7..8d2c3150 100644 --- a/ctx_test.go +++ b/ctx_test.go @@ -1054,6 +1054,24 @@ func Test_Ctx_Redirect(t *testing.T) { // // TODO // } +// go test -run Test_Ctx_Render_Go_Template +func Test_Ctx_Render_Go_Template(t *testing.T) { + t.Parallel() + file, err := ioutil.TempFile(os.TempDir(), "fiber") + utils.AssertEqual(t, nil, err) + defer os.Remove(file.Name()) + _, err = file.Write([]byte("template")) + utils.AssertEqual(t, nil, err) + err = file.Close() + utils.AssertEqual(t, nil, err) + app := New() + ctx := app.AcquireCtx(&fasthttp.RequestCtx{}) + defer app.ReleaseCtx(ctx) + err = ctx.Render(file.Name(), nil) + utils.AssertEqual(t, nil, err) + utils.AssertEqual(t, "template", string(ctx.Fasthttp.Response.Body())) +} + // go test -run Test_Ctx_Send func Test_Ctx_Send(t *testing.T) { t.Parallel() From 6da47d42955ee800114b7bcfd07a86d25e712b18 Mon Sep 17 00:00:00 2001 From: Alexander Do Date: Sun, 7 Jun 2020 11:05:00 -0700 Subject: [PATCH 2/2] Utilize bytebufferpool for Render --- ctx.go | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/ctx.go b/ctx.go index 99137aa0..8485f21f 100644 --- a/ctx.go +++ b/ctx.go @@ -16,6 +16,7 @@ import ( "mime/multipart" "net/http" "net/url" + "os" "path/filepath" "regexp" "strconv" @@ -750,10 +751,24 @@ func (ctx *Ctx) Render(name string, bind interface{}) (err error) { } } else { // Render raw template using 'name' as filepath if no engine is set - tmpl, err := template.ParseFiles(filepath.Clean(name)) + var tmpl *template.Template + raw := bytebufferpool.Get() + defer bytebufferpool.Put(raw) + // Read file + f, err := os.Open(filepath.Clean(name)) if err != nil { return err } + if _, err = raw.ReadFrom(f); err != nil { + return err + } + if err = f.Close(); err != nil { + return err + } + // Parse template + if tmpl, err = template.New("").Parse(raw.String()); err != nil { + return err + } // Render template if err = tmpl.Execute(buf, bind); err != nil { return err