package responsewriter import ( "bufio" "fmt" "net" "net/http" "reflect" "strings" ) type ContentTypeWriter struct { http.ResponseWriter } func (c ContentTypeWriter) Write(b []byte) (int, error) { found := false for k := range c.Header() { if strings.EqualFold(k, "Content-Type") { found = true break } } if !found { c.Header().Set("Content-Type", http.DetectContentType(b)) } return c.ResponseWriter.Write(b) } func ContentType(handler http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { writer := ContentTypeWriter{ResponseWriter: w} handler.ServeHTTP(writer, r) }) } func (c ContentTypeWriter) Hijack() (net.Conn, *bufio.ReadWriter, error) { if hijacker, ok := c.ResponseWriter.(http.Hijacker); ok { return hijacker.Hijack() } return nil, nil, fmt.Errorf("Upstream ResponseWriter of type %v does not implement http.Hijacker", reflect.TypeOf(c.ResponseWriter)) }