7

http.ResponseWriterいくつかのs が実行された a が与えられた場合.Write()、応答の現在の累積長を直接取得できますか?

これは変換で実行できると確信してHijackいますが、直接実行できるかどうか知りたいです。

4

1 に答える 1

11

インターフェースの根底にあるものを知っていたとしても、http.ResponseWriter何か使えるものがある可能性は低いです。http パッケージの標準を使用して取得した構造体をよく見るServeHTTP、バッファーの長さを取得する方法がないことがわかりますが、それをハイジャックします。

代わりにできることは、ライターをシャドウすることです。

type ResponseWriterWithLength struct {
    http.ResponseWriter
    length int
}

func (w *ResponseWriterWithLength) Write(b []byte) (n int, err error) {
    n, err = w.ResponseWriter.Write(b)

    w.length += n

    return
}

func (w *ResponseWriterWithLength) Length() int {
    return w.length
}

func MyServant(w http.ResponseWriter, r *http.Request) {
    lengthWriter := &ResponseWriterWithLength{w, 0}
}

http.Serverデフォルトで を提供する、独自のバージョンの を作成することもできResponseWriterWithLengthます。

于 2012-12-20T20:58:20.537 に答える