1
0
mirror of https://github.com/astaxie/beego.git synced 2024-11-29 11:01:28 +00:00

better compress func design

This commit is contained in:
JessonChan 2015-11-10 11:32:18 +08:00
parent 891be34fc6
commit 8f42193610

View File

@ -44,16 +44,11 @@ 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
switch encoding { if cf, ok := encodingCompressMap[encoding]; ok {
case "gzip": outputWriter, err = cf(writer, level)
outputWriter, err = gzip.NewWriterLevel(writer, level) } else {
case "deflate":
outputWriter, err = flate.NewWriter(writer, level)
default:
// all the other compress methods will ignore
// such as the deprecated compress and chrome-only sdch
encoding = "" encoding = ""
outputWriter = writer.(io.Writer) outputWriter, err = noneCompress(writer, level)
} }
if err != nil { if err != nil {
return false, "", err return false, "", err
@ -83,13 +78,24 @@ type q struct {
name string name string
value float64 value float64
} }
type compressFunc func(io.Writer, int) (io.Writer, error)
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)
}
var ( var (
encodingMap = map[string]string{ // all the other compress methods will ignore encodingCompressMap = map[string]compressFunc{ // all the other compress methods will ignore
"gzip": "gzip", "gzip": gzipCompress,
"deflate": "deflate", "deflate": deflateCompress,
"*": "gzip", // * means any compress will accept,we prefer gzip "*": gzipCompress, // * means any compress will accept,we prefer gzip
"identity": "", // identity means none-compress "identity": noneCompress, // identity means none-compress
} }
) )
@ -119,5 +125,9 @@ func parseEncoding(r *http.Request) string {
} }
} }
} }
return encodingMap[lastQ.name] if _, ok := encodingCompressMap[lastQ.name]; ok {
return lastQ.name
} else {
return ""
}
} }