mirror of
https://github.com/infinite-iroha/touka.git
synced 2026-06-13 15:47:38 +08:00
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
This commit is contained in:
parent
b4e45610b2
commit
45c6d36748
1 changed files with 20 additions and 15 deletions
27
context.go
27
context.go
|
|
@ -514,27 +514,32 @@ func (c *Context) HTML(code int, name string, obj any) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// HTMLBuf 先将 HTML 模板渲染到 buffer, 成功后再写入状态码和响应体.
|
// HTMLBuf 先将 HTML 模板渲染到 buffer, 成功后再写入状态码和响应体.
|
||||||
// 如果模板渲染失败或不支持缓冲渲染,则回退到标准的 HTML 方法.
|
// 如果模板渲染失败,则返回 500 错误且不写入任何内容.
|
||||||
func (c *Context) HTMLBuf(code int, name string, obj any) {
|
func (c *Context) HTMLBuf(code int, name string, obj any) {
|
||||||
if c.engine != nil && c.engine.HTMLRender != nil {
|
if c.engine == nil || c.engine.HTMLRender == nil {
|
||||||
|
// 没有渲染器,回退到简单输出
|
||||||
|
c.HTML(code, name, obj)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
if tpl, ok := c.engine.HTMLRender.(*template.Template); ok {
|
if tpl, ok := c.engine.HTMLRender.(*template.Template); ok {
|
||||||
var buf bytes.Buffer
|
var buf bytes.Buffer
|
||||||
err := tpl.ExecuteTemplate(&buf, name, obj)
|
err := tpl.ExecuteTemplate(&buf, name, obj)
|
||||||
if err == nil {
|
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.Header().Set("Content-Type", "text/html; charset=utf-8")
|
||||||
c.Writer.WriteHeader(code)
|
c.Writer.WriteHeader(code)
|
||||||
c.Writer.Write(buf.Bytes())
|
c.Writer.Write(buf.Bytes())
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
// 渲染失败,记录错误后回退到 HTML()
|
|
||||||
errMsg := fmt.Errorf("failed to render HTML template '%s': %w", name, err)
|
// 不支持的渲染器类型,回退到简单输出
|
||||||
c.AddError(errMsg)
|
|
||||||
c.ErrorUseHandle(http.StatusInternalServerError, errMsg)
|
|
||||||
// 继续执行回退逻辑
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// 回退到标准 HTML 方法(处理无模板引擎或其他渲染器的情况)
|
|
||||||
c.HTML(code, name, obj)
|
c.HTML(code, name, obj)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue