2 回答
TA贡献2065条经验 获得超14个赞
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(code int) {
w.WroteHeader = true
w.ResponseWriter.WriteHeader(code)
}
在你的处理程序中:
//...
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}}}
只要每个人都调用内部处理程序作为他们对wand做的最后一件事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().
}
- 2 回答
- 0 关注
- 177 浏览
添加回答
举报