48 lines
1017 B
Go
48 lines
1017 B
Go
package http
|
|
|
|
import (
|
|
"fmt"
|
|
"net/http"
|
|
|
|
"github.com/pkg/errors"
|
|
)
|
|
|
|
// CSVContentType
|
|
var (
|
|
CSVContentType = []string{"application/csv"}
|
|
_ Render = CSV{}
|
|
)
|
|
|
|
// Render http reponse render.
|
|
type Render interface {
|
|
Render(http.ResponseWriter) error
|
|
WriteContentType(w http.ResponseWriter)
|
|
}
|
|
|
|
// CSV str.
|
|
type CSV struct {
|
|
Content []byte
|
|
Title string
|
|
}
|
|
|
|
// WriteContentType fn
|
|
func (j CSV) WriteContentType(w http.ResponseWriter) {
|
|
writeContentType(w, CSVContentType, j.Title)
|
|
}
|
|
|
|
func writeContentType(w http.ResponseWriter, value []string, title string) {
|
|
header := w.Header()
|
|
if val := header["Content-Type"]; len(val) == 0 {
|
|
header["Content-Type"] = value
|
|
}
|
|
header["Content-Disposition"] = append(header["Content-Disposition"], fmt.Sprintf("attachment; filename=%s.csv", title))
|
|
}
|
|
|
|
// Render (JSON) writes data with json ContentType.
|
|
func (j CSV) Render(w http.ResponseWriter) (err error) {
|
|
if _, err = w.Write(j.Content); err != nil {
|
|
err = errors.WithStack(err)
|
|
}
|
|
return
|
|
}
|