Response 的 Writer 扩展
Hertz 提供了 response 的 writer 扩展, 用户可以根据自己的需要实现相应的接口去劫持 response 的 writer。
接口定义
接口定义在 pkg/network/writer
.
type ExtWriter interface {
io.Writer
Flush() error
// Finalize will be called by framework before the writer is released.
// Implementations must guarantee that Finalize is safe for multiple calls.
Finalize() error
}
劫持 Response 的 Writer
Hertz 在 app.RequestContext
中提供了 Response.HijackWriter
方法让用户劫持 response 的 writer.
用法示例:
h.GET("/hijack", func(c context.Context, ctx *app.RequestContext) {
// Hijack the writer of response
ctx.Response.HijackWriter(yourResponseWriter)
}
已支持 Response 的 Writer 扩展
Hertz 在 pkg/protocol/http1/resp/writer
下提供了 NewChunkedBodyWriter
方法来创建一个 response 的 writer,它允许用户在 handler 中立即刷新分块,用户也可以实现自己的 response 的 writer。
ChunkedBodyWriter
用法示例:
h.GET("/flush/chunk", func(c context.Context, ctx *app.RequestContext) {
// Hijack the writer of response
ctx.Response.HijackWriter(resp.NewChunkedBodyWriter(&ctx.Response, ctx.GetWriter()))
for i := 0; i < 10; i++ {
ctx.Write([]byte(fmt.Sprintf("chunk %d: %s", i, strings.Repeat("hi~", i)))) // nolint: errcheck
ctx.Flush() // nolint: errcheck
time.Sleep(200 * time.Millisecond)
}
})
最后修改
April 18, 2023
: docs(wip): request context handler (36ea2d4)