From b4e45610b23f9c290cbb452c7313f3e6fd858290 Mon Sep 17 00:00:00 2001 From: wjqserver <114663932+WJQSERVER@users.noreply.github.com> Date: Mon, 30 Mar 2026 00:29:50 +0800 Subject: [PATCH] refactor(HTMLBuf): delegate fallback to HTML() method Reduce code duplication by calling c.HTML() for fallback cases: - When template rendering fails - When HTMLRender is not configured - When HTMLRender is not a *template.Template This ensures consistent behavior between HTMLBuf and HTML methods. --- context.go | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/context.go b/context.go index 22f67ea..e1cb4f6 100644 --- a/context.go +++ b/context.go @@ -514,27 +514,28 @@ func (c *Context) HTML(code int, name string, obj any) { } // HTMLBuf 先将 HTML 模板渲染到 buffer, 成功后再写入状态码和响应体. +// 如果模板渲染失败或不支持缓冲渲染,则回退到标准的 HTML 方法. 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 { - errMsg := fmt.Errorf("failed to render HTML template '%s': %w", name, err) - c.AddError(errMsg) - c.ErrorUseHandle(http.StatusInternalServerError, errMsg) + if err == nil { + // 渲染成功,写入响应 + c.Writer.Header().Set("Content-Type", "text/html; charset=utf-8") + c.Writer.WriteHeader(code) + c.Writer.Write(buf.Bytes()) return } - c.Writer.Header().Set("Content-Type", "text/html; charset=utf-8") - c.Writer.WriteHeader(code) - c.Writer.Write(buf.Bytes()) - return + // 渲染失败,记录错误后回退到 HTML() + errMsg := fmt.Errorf("failed to render HTML template '%s': %w", name, err) + c.AddError(errMsg) + c.ErrorUseHandle(http.StatusInternalServerError, errMsg) + // 继续执行回退逻辑 } } - // 默认简单输出 - c.Writer.Header().Set("Content-Type", "text/html; charset=utf-8") - c.Writer.WriteHeader(code) - c.Writer.Write(fmt.Appendf(nil, "\n
%v
", name, obj)) + // 回退到标准 HTML 方法(处理无模板引擎或其他渲染器的情况) + c.HTML(code, name, obj) } // Redirect 执行 HTTP 重定向