下面的代碼重寫了一些查詢的 http body 響應(yīng)。但是,它無(wú)法更新“內(nèi)容長(zhǎng)度”標(biāo)頭字段,它始終保持相同的原始值。如何更新 http 響應(yīng)的內(nèi)容長(zhǎng)度標(biāo)頭字段?type writeReplacer struct { http.ResponseWriter search []byte replace func(*http.Request) string buf []byte r *http.Request dir string}func (w *writeReplacer) Write(in []byte) (int, error) { if w.buf == nil { w.buf = []byte{} } w.buf = append(w.buf, in...) n := len(in) if index := bytes.LastIndex(w.buf, w.search); index > -1 { var r []byte if w.dir == "before" { g := []byte(w.replace(w.r)) n += len(g) r = append(g, w.buf[index:]...) w.buf = append(w.buf[:index], r...) } else { g := []byte(w.replace(w.r)) n += len(g) r = append(r, w.buf[:index+len(w.search)]...) r = append(r, g...) r = append(r, w.buf[index:]...) w.buf = r } } return n, nil}func (w *writeReplacer) Flush() { w.ResponseWriter.Header().Set("Content-Length", fmt.Sprint(len(w.buf))) w.ResponseWriter.Write(w.buf[:]) w.buf = w.buf[:0]}func InsertAfter(h http.Handler, path string, search []byte, replace func(*http.Request) string) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { if r.URL.Path == path { w.Header().Del("Content-length") w = &writeReplacer{ResponseWriter: w, search: search, replace: replace, r: r, dir: "after"} defer w.(http.Flusher).Flush() } h.ServeHTTP(w, r) })}func InsertBefore(h http.Handler, path string, search []byte, replace func(*http.Request) string) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { if r.URL.Path == path { w.Header().Del("Content-length") w = &writeReplacer{ResponseWriter: w, search: search, replace: replace, r: r, dir: "before"} defer w.(http.Flusher).Flush() } h.ServeHTTP(w, r) })}
1 回答

慕少森
TA貢獻(xiàn)2019條經(jīng)驗(yàn) 獲得超9個(gè)贊
訣竅是重寫ResponseWriter.WriteHeader.
我相信這與 write 可能會(huì)在第一次調(diào)用時(shí)調(diào)用 writeheader 這一事實(shí)有關(guān),從那里我沒(méi)有將指令放在正確的位置。
為了防止進(jìn)一步的困難,我更喜歡使用分塊傳輸。
代碼更改是:
func (w *writeReplacer) WriteHeader(statusCode int) {
? ? w.Header().Del("Content-length")
? ? w.Header().Set("Transfer-Encoding", "chunked")
? ? w.ResponseWriter.WriteHeader(statusCode)
}
- 1 回答
- 0 關(guān)注
- 155 瀏覽
添加回答
舉報(bào)
0/150
提交
取消