From 45c6d36748adc473c7c05de96dccf33b238eb15c Mon Sep 17 00:00:00 2001 From: wjqserver <114663932+WJQSERVER@users.noreply.github.com> Date: Mon, 30 Mar 2026 01:02:37 +0800 Subject: [PATCH] fix(HTMLBuf): return 500 on template error, no content - Remove fallback to HTML() on template rendering failure - Return 500 error without writing any content on error - Only fallback to HTML() when renderer is nil or unsupported type - Prevents multiple response writes --- context.go | 35 ++++++++++++++++++++--------------- 1 file changed, 20 insertions(+), 15 deletions(-) diff --git a/context.go b/context.go index e1cb4f6..cf22333 100644 --- a/context.go +++ b/context.go @@ -514,27 +514,32 @@ func (c *Context) HTML(code int, name string, obj any) { } // HTMLBuf 先将 HTML 模板渲染到 buffer, 成功后再写入状态码和响应体. -// 如果模板渲染失败或不支持缓冲渲染,则回退到标准的 HTML 方法. +// 如果模板渲染失败,则返回 500 错误且不写入任何内容. func (c *Context) HTMLBuf(code int, name string, obj any) { - if c.engine != nil && c.engine.HTMLRender != nil { - if tpl, ok := c.engine.HTMLRender.(*template.Template); ok { - var buf bytes.Buffer - err := tpl.ExecuteTemplate(&buf, name, obj) - if err == nil { - // 渲染成功,写入响应 - c.Writer.Header().Set("Content-Type", "text/html; charset=utf-8") - c.Writer.WriteHeader(code) - c.Writer.Write(buf.Bytes()) - return - } - // 渲染失败,记录错误后回退到 HTML() + if c.engine == nil || c.engine.HTMLRender == nil { + // 没有渲染器,回退到简单输出 + c.HTML(code, name, obj) + return + } + + if tpl, ok := c.engine.HTMLRender.(*template.Template); ok { + var buf bytes.Buffer + err := tpl.ExecuteTemplate(&buf, name, obj) + if err != nil { + // 渲染失败,记录错误并返回 500,不写入任何内容 errMsg := fmt.Errorf("failed to render HTML template '%s': %w", name, err) c.AddError(errMsg) c.ErrorUseHandle(http.StatusInternalServerError, errMsg) - // 继续执行回退逻辑 + return } + // 渲染成功,写入响应 + c.Writer.Header().Set("Content-Type", "text/html; charset=utf-8") + c.Writer.WriteHeader(code) + c.Writer.Write(buf.Bytes()) + return } - // 回退到标准 HTML 方法(处理无模板引擎或其他渲染器的情况) + + // 不支持的渲染器类型,回退到简单输出 c.HTML(code, name, obj) }