亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何判斷 net/http 的 ResponseWriter.Write() 是否已被調用?

如何判斷 net/http 的 ResponseWriter.Write() 是否已被調用?

Go
慕的地6264312 2021-11-01 10:34:18
假設我有一個 net/http 處理程序鏈,一個早期的處理程序以 HTTP 錯誤響應(http.StatusInternalServerError例如)。如何在以下處理程序中檢測到這一點,并避免向客戶端發送額外數據?或者這完全是解決問題的錯誤方法?
查看完整描述

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().

}


查看完整回答
反對 回復 2021-11-01
?
躍然一笑

TA貢獻1826條經驗 獲得超6個贊

第一:可能存在更輕量級的解決方案。

但是,如果您找不到,請考慮使用x/net/context允許您實現超時、截止日期,當然還有中間件鏈的提前終止。


查看完整回答
反對 回復 2021-11-01
  • 2 回答
  • 0 關注
  • 227 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號