如何判断nethttp的ResponseWriter.Write()是否已被调用?

如何判断nethttp的ResponseWriter.Write()是否已被调用?,第1张

如何判断net / http的ResponseWriter.Write()是否已被调用

http.ResponseWriter
是一个接口。因此,只需编写一个新实例:

type MyResponseWriter struct {    http.ResponseWriter    WroteHeader bool}func (w *MyResponseWriter) Write(b []byte) (int, error) {    w.WroteHeader = true    return w.ResponseWriter.Write(b)}func (w *MyResponseWriter) WriteHeader(pre int) {    w.WroteHeader = true    w.ResponseWriter.WriteHeader(pre)}

在您的处理程序中:

//...if w, ok := w.(*MyResponseWriter); ok && w.WroteHeader {    log.Println("Already wrote, skipping")    return}

编辑: 另一件事要考虑。在大多数情况下,如果您具有处理程序的“链”,则意味着在处理程序内部调用处理程序。所以如果你有类似的东西

type Handler1 struct { http.Handler }type Handler2 struct { http.Handler }type Handler3 struct { http.Handler }var MyHandler http.Handler = Handler1{Handler2{Handler3{h}}}

只要每个那些调用内部处理程序 ,因为他们与做的最后一件事

w
r
,你应该罚款,因为那时
w
r
甚至不会到达内处理。例如

func (h Handler2) ServeHTTP(w http.ResponseWriter, r *http.Request) {    if somethingBadHappened() {        w.WriteHeader(http.StatusInternalServerError)        return    }    h.ServeHTTP(w, r) // Not called if somethingBadHappened().}


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zaji/5086868.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-11-16
下一篇2022-11-16

发表评论

登录后才能评论

评论列表(0条)

    保存