Skip to content

Instantly share code, notes, and snippets.



Last active Oct 8, 2020
What would you like to do?
Capturing the HTTP status code from http.ResponseWriter
package main
import (
func main() {
// We need to cast handleRoot to a http.HandlerFunc since wrapHandlerWithLogging
// takes a http.Handler, not an arbitrary function.
handler := wrapHandlerWithLogging(http.HandlerFunc(handleRoot))
http.Handle("/", handler)
log.Fatal(http.ListenAndServe(":8080", nil))
// ---- Handlers
func handleRoot(w http.ResponseWriter, req *http.Request) {
if req.URL.Path != "/" {
http.NotFound(w, req)
fmt.Fprintf(w, "Hello, World!")
// ---- Logging
func wrapHandlerWithLogging(wrappedHandler http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) {
log.Printf("--> %s %s", req.Method, req.URL.Path)
lrw := NewLoggingResponseWriter(w)
wrappedHandler.ServeHTTP(lrw, req)
statusCode := lrw.statusCode
log.Printf("<-- %d %s", statusCode, http.StatusText(statusCode))
type loggingResponseWriter struct {
statusCode int
func NewLoggingResponseWriter(w http.ResponseWriter) *loggingResponseWriter {
// WriteHeader(int) is not called if our response implicitly returns 200 OK, so
// we default to that status code.
return &loggingResponseWriter{w, http.StatusOK}
func (lrw *loggingResponseWriter) WriteHeader(code int) {
lrw.statusCode = code

This comment has been minimized.

Copy link

@rugwirobaker rugwirobaker commented Apr 27, 2018

When I tried this I got this error:
cannot convert w (type http.ResponseWriter) to type loggingResponseWriter


This comment has been minimized.

Copy link

@vigo vigo commented Jul 25, 2018

@rugwirobaker it works fine...


This comment has been minimized.

Copy link

@ORESoftware ORESoftware commented Mar 27, 2020

does it really have to come down to this! lulz fml

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.