1
0
mirror of https://github.com/astaxie/beego.git synced 2024-11-22 13:50:54 +00:00

refactor accept encoder ,simplify the struct

This commit is contained in:
JessonChan 2015-11-12 12:03:53 +08:00
parent 214030fad4
commit 46fbeaadad

View File

@ -25,6 +25,26 @@ import (
"strings" "strings"
) )
type acceptEncoder struct {
name string
encode func(io.Writer, int) (io.Writer, error)
}
var (
noneCompressEncoder = acceptEncoder{"", func(wr io.Writer, level int) (io.Writer, error) { return wr, nil }}
gzipCompressEncoder = acceptEncoder{"gzip", func(wr io.Writer, level int) (io.Writer, error) { return gzip.NewWriterLevel(wr, level) }}
deflateCompressEncoder = acceptEncoder{"deflate", func(wr io.Writer, level int) (io.Writer, error) { return flate.NewWriter(wr, level) }}
)
var (
encoderMap = map[string]acceptEncoder{ // all the other compress methods will ignore
"gzip": gzipCompressEncoder,
"deflate": deflateCompressEncoder,
"*": gzipCompressEncoder, // * means any compress will accept,we prefer gzip
"identity": noneCompressEncoder, // identity means none-compress
}
)
// WriteFile reads from file and writes to writer by the specific encoding(gzip/deflate) // WriteFile reads from file and writes to writer by the specific encoding(gzip/deflate)
func WriteFile(encoding string, writer io.Writer, file *os.File) (bool, string, error) { func WriteFile(encoding string, writer io.Writer, file *os.File) (bool, string, error) {
@ -43,16 +63,23 @@ func WriteBody(encoding string, writer io.Writer, content []byte) (bool, string,
func writeLevel(encoding string, writer io.Writer, reader io.Reader, level int) (bool, string, error) { func writeLevel(encoding string, writer io.Writer, reader io.Reader, level int) (bool, string, error) {
var outputWriter io.Writer var outputWriter io.Writer
var err error var err error
var ce = noneCompressEncoder
if cf, ok := encoderMap[encoding]; ok { if cf, ok := encoderMap[encoding]; ok {
outputWriter, err = cf.encode(writer, level) ce = cf
} else {
encoding = ""
outputWriter, err = noneCompress(writer, level)
} }
encoding = ce.name
outputWriter, err = ce.encode(writer, level)
if err != nil { if err != nil {
return false, "", err return false, "", err
} }
io.Copy(outputWriter, reader)
_, err = io.Copy(outputWriter, reader)
if err != nil {
return false, "", err
}
switch outputWriter.(type) { switch outputWriter.(type) {
case io.WriteCloser: case io.WriteCloser:
outputWriter.(io.WriteCloser).Close() outputWriter.(io.WriteCloser).Close()
@ -76,30 +103,6 @@ type q struct {
value float64 value float64
} }
func noneCompress(wr io.Writer, level int) (io.Writer, error) {
return wr, nil
}
func gzipCompress(wr io.Writer, level int) (io.Writer, error) {
return gzip.NewWriterLevel(wr, level)
}
func deflateCompress(wr io.Writer, level int) (io.Writer, error) {
return flate.NewWriter(wr, level)
}
type acceptEncoder struct {
name string
encode func(io.Writer, int) (io.Writer, error)
}
var (
encoderMap = map[string]acceptEncoder{ // all the other compress methods will ignore
"gzip": acceptEncoder{"gzip", gzipCompress},
"deflate": acceptEncoder{"deflate", deflateCompress},
"*": acceptEncoder{"gzip", gzipCompress}, // * means any compress will accept,we prefer gzip
"identity": acceptEncoder{"", noneCompress}, // identity means none-compress
}
)
func parseEncoding(r *http.Request) string { func parseEncoding(r *http.Request) string {
acceptEncoding := r.Header.Get("Accept-Encoding") acceptEncoding := r.Header.Get("Accept-Encoding")
if acceptEncoding == "" { if acceptEncoding == "" {