package render import ( "io" "net/http" "strconv" ) type Reader struct { ContentType string ContentLength int64 Reader io.Reader Headers map[string]string } // Render (Reader) writes data with custom ContentType and headers. func (r Reader) Render(w http.ResponseWriter) (err error) { r.WriteContentType(w) r.Headers["Content-Length"] = strconv.FormatInt(r.ContentLength, 10) r.writeHeaders(w, r.Headers) _, err = io.Copy(w, r.Reader) return } func (r Reader) WriteContentType(w http.ResponseWriter) { writeContentType(w, []string{r.ContentType}) } func (r Reader) writeHeaders(w http.ResponseWriter, headers map[string]string) { header := w.Header() for k, v := range headers { if val := header[k]; len(val) == 0 { header[k] = []string{v} } } }