2012-12-20 21 views

risposta

10

Anche se sapresti quello che si ottiene, sottostante l'interfaccia http.ResponseWriter, le probabilità sono basse, che c'è qualcosa di utilizzabile. Se si look closer alla struct si ottiene utilizzando lo standard ServeHTTP del pacchetto HTTP, vedrete che non c'è modo per raggiungere la lunghezza del buffer, ma dirottamento esso.

Cosa si può fare in alternativa, è shadowing lo scrittore:

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} 
} 

Si potrebbe anche voler scrivere la propria versione di http.Server, che serve la ResponseWriterWithLength per impostazione predefinita.

+0

Questo è esattamente quello che stavo cercando di indovinare. Grazie per la conferma. –

+0

L'unico problema di questo approccio è che non tiene conto di lunghezza intestazioni. – dolzenko

Problemi correlati