Skip to content

Instantly share code, notes, and snippets.

@ciaranarcher
Created July 27, 2014 06:53
Show Gist options
  • Save ciaranarcher/abccf50cb37645ca27fa to your computer and use it in GitHub Desktop.
Save ciaranarcher/abccf50cb37645ca27fa to your computer and use it in GitHub Desktop.
Wrapping a ResponseWriter to capture the status code
// Create our own MyResponseWriter to wrap a standard http.ResponseWriter
// so we can store the status code.
type MyResponseWriter struct {
status int
http.ResponseWriter
}
func NewMyResponseWriter(res http.ResponseWriter) *MyResponseWriter {
// Default the status code to 200
return &MyResponseWriter{200, res}
}
// Give a way to get the status
func (w MyResponseWriter) Status() int {
return w.status
}
// Satisfy the http.ResponseWriter interface
func (w MyResponseWriter) Header() http.Header {
return w.ResponseWriter.Header()
}
func (w MyResponseWriter) Write(data []byte) (int, error) {
return w.ResponseWriter.Write(data)
}
func (w MyResponseWriter) WriteHeader(statusCode int) {
// Store the status code
w.status = statusCode
// Write the status code onward.
w.ResponseWriter.WriteHeader(statusCode)
}
@renthraysk
Copy link

http.Pusher interface can be implemented, as the documentation states

// Push returns ErrNotSupported if the client has disabled push or if push
// is not supported on the underlying connection.

func (w *MyResponseWriter) Push(target string, opts *http.PushOptions) error {
	if p, ok := w.ResponseWriter.(http.Pusher); ok {
		return p.Push(target, opts)
	}
	return http.ErrNotSupported
}

http.Hijacker interface isn't implemented in http2 connections.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment