http-add-on/interceptor/middleware/responsewriter.go

61 lines
1.3 KiB
Go

package middleware
import (
"bufio"
"errors"
"net"
"net/http"
)
type responseWriter struct {
downstreamResponseWriter http.ResponseWriter
bytesWritten int
statusCode int
}
func newResponseWriter(downstreamResponseWriter http.ResponseWriter) *responseWriter {
return &responseWriter{
downstreamResponseWriter: downstreamResponseWriter,
}
}
func (rw *responseWriter) BytesWritten() int {
return rw.bytesWritten
}
func (rw *responseWriter) StatusCode() int {
return rw.statusCode
}
var _ http.ResponseWriter = (*responseWriter)(nil)
var _ http.Hijacker = (*responseWriter)(nil)
func (rw *responseWriter) Header() http.Header {
return rw.downstreamResponseWriter.Header()
}
func (rw *responseWriter) Write(bytes []byte) (int, error) {
n, err := rw.downstreamResponseWriter.Write(bytes)
if f, ok := rw.downstreamResponseWriter.(http.Flusher); ok {
f.Flush()
}
rw.bytesWritten += n
return n, err
}
func (rw *responseWriter) WriteHeader(statusCode int) {
rw.downstreamResponseWriter.WriteHeader(statusCode)
rw.statusCode = statusCode
}
func (rw *responseWriter) Hijack() (net.Conn, *bufio.ReadWriter, error) {
if hj, ok := rw.downstreamResponseWriter.(http.Hijacker); ok {
return hj.Hijack()
}
return nil, nil, errors.New("http.Hijacker not implemented")
}