mirror of
https://github.com/infinite-iroha/touka.git
synced 2026-06-13 23:57:38 +08:00
Compare commits
No commits in common. "fba6fedfc50b0cee17906de58e366072344ac35a" and "7e15181c0b49694187ee8c87ec1bb85c4c2d0c73" have entirely different histories.
fba6fedfc5
...
7e15181c0b
1 changed files with 30 additions and 41 deletions
71
context.go
71
context.go
|
|
@ -418,19 +418,18 @@ func (c *Context) JSON(code int, obj any) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// JSONBuf 先将 JSON 编码到 buffer, 成功后再写入状态码和响应体.
|
// JSONBuf 先将 JSON 编码到 buffer, 成功后再写入状态码和响应体.
|
||||||
// 与 JSON 相比,编码失败时可以正确返回 500 状态码,代价是多一次内存分配.
|
// 与 JSON 相比, 编码失败时可以正确返回 500 状态码, 代价是多一次内存分配.
|
||||||
func (c *Context) JSONBuf(code int, obj any) {
|
func (c *Context) JSONBuf(code int, obj any) {
|
||||||
var buf bytes.Buffer
|
data, err := json.Marshal(obj)
|
||||||
if err := json.MarshalWrite(&buf, obj); err != nil {
|
if err != nil {
|
||||||
errMsg := fmt.Errorf("failed to marshal JSON: %w", err)
|
c.AddError(fmt.Errorf("failed to marshal JSON: %w", err))
|
||||||
c.AddError(errMsg)
|
c.Errorf("failed to marshal JSON: %s", err)
|
||||||
c.ErrorUseHandle(http.StatusInternalServerError, errMsg)
|
c.ErrorUseHandle(http.StatusInternalServerError, fmt.Errorf("failed to marshal JSON: %w", err))
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
c.Writer.Header().Set("Content-Type", "application/json; charset=utf-8")
|
c.Writer.Header().Set("Content-Type", "application/json; charset=utf-8")
|
||||||
c.Writer.WriteHeader(code)
|
c.Writer.WriteHeader(code)
|
||||||
c.Writer.Write(buf.Bytes())
|
c.Writer.Write(data)
|
||||||
}
|
}
|
||||||
|
|
||||||
// GOB 向响应写入GOB数据
|
// GOB 向响应写入GOB数据
|
||||||
|
|
@ -452,9 +451,8 @@ func (c *Context) GOBBuf(code int, obj any) {
|
||||||
var buf bytes.Buffer
|
var buf bytes.Buffer
|
||||||
encoder := gob.NewEncoder(&buf)
|
encoder := gob.NewEncoder(&buf)
|
||||||
if err := encoder.Encode(obj); err != nil {
|
if err := encoder.Encode(obj); err != nil {
|
||||||
errMsg := fmt.Errorf("failed to encode GOB: %w", err)
|
c.AddError(fmt.Errorf("failed to encode GOB: %w", err))
|
||||||
c.AddError(errMsg)
|
c.ErrorUseHandle(http.StatusInternalServerError, fmt.Errorf("failed to encode GOB: %w", err))
|
||||||
c.ErrorUseHandle(http.StatusInternalServerError, errMsg)
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
c.Writer.Header().Set("Content-Type", "application/octet-stream")
|
c.Writer.Header().Set("Content-Type", "application/octet-stream")
|
||||||
|
|
@ -478,17 +476,15 @@ func (c *Context) WANF(code int, obj any) {
|
||||||
|
|
||||||
// WANFBuf 先将 WANF 编码到 buffer, 成功后再写入状态码和响应体.
|
// WANFBuf 先将 WANF 编码到 buffer, 成功后再写入状态码和响应体.
|
||||||
func (c *Context) WANFBuf(code int, obj any) {
|
func (c *Context) WANFBuf(code int, obj any) {
|
||||||
var buf bytes.Buffer
|
data, err := wanf.Marshal(obj)
|
||||||
encoder := wanf.NewStreamEncoder(&buf)
|
if err != nil {
|
||||||
if err := encoder.Encode(obj); err != nil {
|
c.AddError(fmt.Errorf("failed to encode WANF: %w", err))
|
||||||
errMsg := fmt.Errorf("failed to encode WANF: %w", err)
|
c.ErrorUseHandle(http.StatusInternalServerError, fmt.Errorf("failed to encode WANF: %w", err))
|
||||||
c.AddError(errMsg)
|
|
||||||
c.ErrorUseHandle(http.StatusInternalServerError, errMsg)
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
c.Writer.Header().Set("Content-Type", "application/vnd.wjqserver.wanf; charset=utf-8")
|
c.Writer.Header().Set("Content-Type", "application/vnd.wjqserver.wanf; charset=utf-8")
|
||||||
c.Writer.WriteHeader(code)
|
c.Writer.WriteHeader(code)
|
||||||
c.Writer.Write(buf.Bytes())
|
c.Writer.Write(data)
|
||||||
}
|
}
|
||||||
|
|
||||||
// HTML 渲染 HTML 模板
|
// HTML 渲染 HTML 模板
|
||||||
|
|
@ -516,33 +512,26 @@ func (c *Context) HTML(code int, name string, obj any) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// HTMLBuf 先将 HTML 模板渲染到 buffer, 成功后再写入状态码和响应体.
|
// HTMLBuf 先将 HTML 模板渲染到 buffer, 成功后再写入状态码和响应体.
|
||||||
// 如果模板渲染失败,则返回 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 {
|
||||||
// 没有渲染器,回退到简单输出
|
if tpl, ok := c.engine.HTMLRender.(*template.Template); ok {
|
||||||
c.HTML(code, name, obj)
|
var buf bytes.Buffer
|
||||||
return
|
err := tpl.ExecuteTemplate(&buf, name, obj)
|
||||||
}
|
if err != nil {
|
||||||
|
c.AddError(fmt.Errorf("failed to render HTML template '%s': %w", name, err))
|
||||||
if tpl, ok := c.engine.HTMLRender.(*template.Template); ok {
|
c.ErrorUseHandle(http.StatusInternalServerError, fmt.Errorf("failed to render HTML template '%s': %w", name, err))
|
||||||
var buf bytes.Buffer
|
return
|
||||||
err := tpl.ExecuteTemplate(&buf, name, obj)
|
}
|
||||||
if err != nil {
|
c.Writer.Header().Set("Content-Type", "text/html; charset=utf-8")
|
||||||
// 渲染失败,记录错误并返回 500,不写入任何内容
|
c.Writer.WriteHeader(code)
|
||||||
errMsg := fmt.Errorf("failed to render HTML template '%s': %w", name, err)
|
c.Writer.Write(buf.Bytes())
|
||||||
c.AddError(errMsg)
|
|
||||||
c.ErrorUseHandle(http.StatusInternalServerError, errMsg)
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
// 渲染成功,写入响应
|
|
||||||
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.HTML(code, name, obj)
|
c.Writer.WriteHeader(code)
|
||||||
|
c.Writer.Write(fmt.Appendf(nil, "<!-- HTML rendered for %s -->\n<pre>%v</pre>", name, obj))
|
||||||
}
|
}
|
||||||
|
|
||||||
// Redirect 执行 HTTP 重定向
|
// Redirect 执行 HTTP 重定向
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue