mirror of
https://github.com/astaxie/beego.git
synced 2024-11-26 06:11:29 +00:00
refactor accept encoder ,simplify the struct
This commit is contained in:
parent
214030fad4
commit
46fbeaadad
@ -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 == "" {
|
||||||
|
Loading…
Reference in New Issue
Block a user