Instantly share code, notes, and snippets.

@Boerworz /main.go
Last active Jul 25, 2018

Embed
What would you like to do?
Capturing the HTTP status code from http.ResponseWriter
package main
import (
"fmt"
"log"
"net/http"
)
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)
return
}
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 {
http.ResponseWriter
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
lrw.ResponseWriter.WriteHeader(code)
}
@rugwirobaker

This comment has been minimized.

Show comment
Hide comment
@rugwirobaker

rugwirobaker Apr 27, 2018

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

rugwirobaker commented Apr 27, 2018

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

@vigo

This comment has been minimized.

Show comment
Hide comment
@vigo

vigo Jul 25, 2018

@rugwirobaker it works fine...

vigo commented Jul 25, 2018

@rugwirobaker it works fine...

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