From 140b513c7b8b5c2b88a2413114a097ee6a49e5e8 Mon Sep 17 00:00:00 2001 From: astaxie Date: Thu, 18 Apr 2013 23:13:53 +0800 Subject: [PATCH] support gzip #37 --- beego.go | 7 +++++++ controller.go | 38 +++++++++++++++++++++++++++++++++++--- 2 files changed, 42 insertions(+), 3 deletions(-) diff --git a/beego.go b/beego.go index 8e0868d8..04a583b2 100644 --- a/beego.go +++ b/beego.go @@ -37,6 +37,7 @@ var ( SessionSavePath string // session savepath if use mysql/redis/file this set to the connectinfo UseFcgi bool MaxMemory int64 + EnableGzip bool // enable gzip GlobalSessions *session.Manager //GlobalSessions ) @@ -66,6 +67,7 @@ func init() { SessionSavePath = "" UseFcgi = false MaxMemory = 1 << 26 //64MB + EnableGzip = false } else { HttpAddr = AppConfig.String("httpaddr") if v, err := AppConfig.Int("httpport"); err != nil { @@ -135,6 +137,11 @@ func init() { } else { UseFcgi = ar } + if ar, err := AppConfig.Bool("enablegzip"); err != nil { + EnableGzip = false + } else { + EnableGzip = ar + } } StaticDir["/static"] = "static" diff --git a/controller.go b/controller.go index 3d5906b4..f2cc0044 100644 --- a/controller.go +++ b/controller.go @@ -2,6 +2,8 @@ package beego import ( "bytes" + "compress/gzip" + "compress/zlib" "encoding/json" "encoding/xml" "github.com/astaxie/beego/session" @@ -91,9 +93,39 @@ func (c *Controller) Render() error { if err != nil { return err } else { - c.Ctx.SetHeader("Content-Length", strconv.Itoa(len(rb)), true) - c.Ctx.ContentType("text/html") - c.Ctx.ResponseWriter.Write(rb) + c.Ctx.ResponseWriter.Header().Set("Content-Type", "text/html; charset=utf-8") + output_writer := c.Ctx.ResponseWriter.(io.Writer) + if EnableGzip == true && c.Ctx.Request.Header.Get("Accept-Encoding") != "" { + splitted := strings.SplitN(c.Ctx.Request.Header.Get("Accept-Encoding"), ",", -1) + encodings := make([]string, len(splitted)) + + for i, val := range splitted { + encodings[i] = strings.TrimSpace(val) + } + for _, val := range encodings { + if val == "gzip" { + c.Ctx.ResponseWriter.Header().Set("Content-Encoding", "gzip") + output_writer, _ = gzip.NewWriterLevel(c.Ctx.ResponseWriter, gzip.BestSpeed) + + break + } else if val == "deflate" { + c.Ctx.ResponseWriter.Header().Set("Content-Encoding", "deflate") + output_writer, _ = zlib.NewWriterLevel(c.Ctx.ResponseWriter, zlib.BestSpeed) + break + } + } + } else { + c.Ctx.SetHeader("Content-Length", strconv.Itoa(len(rb)), true) + } + output_writer.Write(rb) + switch output_writer.(type) { + case *gzip.Writer: + output_writer.(*gzip.Writer).Close() + case *zlib.Writer: + output_writer.(*zlib.Writer).Close() + case io.WriteCloser: + output_writer.(io.WriteCloser).Close() + } return nil } return nil