Skip to content

Instantly share code, notes, and snippets.

Last active October 10, 2023 09:14
  • Star 28 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
Star You must be signed in to star a gist
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
Copy link

@ORESoftware, you literally have software in you name!!

Copy link

@ORESoftware, you literally have software in you name!!
i can solve everything i got superpowers

Copy link

This was a lovely solution, thanks

Copy link

It helps a lot, thanks

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