第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

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

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

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

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

2 回答

?
翻翻過去那場雪

TA貢獻(xiàn)2065條經(jīng)驗(yàn) 獲得超14個(gè)贊

http.ResponseWriter是一個(gè)接口。所以只需編寫它的一個(gè)新實(shí)例:


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

}

編輯:另一件事要考慮。大多數(shù)情況下,如果您有處理程序的“鏈”,則意味著在處理程序內(nèi)部調(diào)用處理程序。所以如果你有類似的東西


type Handler1 struct { http.Handler }

type Handler2 struct { http.Handler }

type Handler3 struct { http.Handler }

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

只要每個(gè)人都調(diào)用內(nèi)部處理程序作為他們對wand做的最后一件事r,你應(yīng)該沒問題,因?yàn)槟菢觲并且r甚至不會到達(dá)內(nèi)部處理程序。例如


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

}


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

TA貢獻(xiàn)1826條經(jīng)驗(yàn) 獲得超6個(gè)贊

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

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


查看完整回答
反對 回復(fù) 2021-11-01
  • 2 回答
  • 0 關(guān)注
  • 206 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號