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 關注
- 227 瀏覽
添加回答
舉報
