1// Copyright 2018 Gin Core Team.  All rights reserved.
2// Use of this source code is governed by a MIT style
3// license that can be found in the LICENSE file.
4
5package render
6
7import (
8	"io"
9	"net/http"
10	"strconv"
11)
12
13// Reader contains the IO reader and its length, and custom ContentType and other headers.
14type Reader struct {
15	ContentType   string
16	ContentLength int64
17	Reader        io.Reader
18	Headers       map[string]string
19}
20
21// Render (Reader) writes data with custom ContentType and headers.
22func (r Reader) Render(w http.ResponseWriter) (err error) {
23	r.WriteContentType(w)
24	if r.ContentLength >= 0 {
25		if r.Headers == nil {
26			r.Headers = map[string]string{}
27		}
28		r.Headers["Content-Length"] = strconv.FormatInt(r.ContentLength, 10)
29	}
30	r.writeHeaders(w, r.Headers)
31	_, err = io.Copy(w, r.Reader)
32	return
33}
34
35// WriteContentType (Reader) writes custom ContentType.
36func (r Reader) WriteContentType(w http.ResponseWriter) {
37	writeContentType(w, []string{r.ContentType})
38}
39
40// writeHeaders writes custom Header.
41func (r Reader) writeHeaders(w http.ResponseWriter, headers map[string]string) {
42	header := w.Header()
43	for k, v := range headers {
44		if header.Get(k) == "" {
45			header.Set(k, v)
46		}
47	}
48}
49