Go: debugging multiple response.WriteHeader calls
Say you’re building a HTTP service in Go and suddenly it starts giving you these:
http: multiple response.WriteHeader calls
Horrible when that happens, right?
It’s not always very easy to figure out why you get them and where they come from. Here’s a hack to help you trace them back to their origin:
type debugLogger struct{}
func (d debugLogger) Write(p []byte) (n int, err error) {
s := string(p)
if strings.Contains(s, "multiple response.WriteHeader") {
debug.PrintStack()
}
return os.Stderr.Write(p)
}
// Now use the logger with your http.Server:
logger := log.New(debugLogger{}, "", 0)
server := &http.Server{
Addr: ":3001",
Handler: s,
ErrorLog: logger,
}
log.Fatal(server.ListenAndServe())
This will output a nice stack trace whenever it happens. Happy hacking!
Related
- sql-migrate slides (February 9, 2016)