diff options
author | Lunny Xiao <xiaolunwen@gmail.com> | 2020-12-24 12:25:17 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-12-24 12:25:17 +0800 |
commit | 19ae6439b0956a578100b50cb09b1cbd40a01942 (patch) | |
tree | 48ad57f2d5fdb5c2d00735585c07089f795477d3 /modules/public/static.go | |
parent | 87a0396719dc12a19e9876bd4e5ba6ea008072d8 (diff) | |
download | gitea-19ae6439b0956a578100b50cb09b1cbd40a01942.tar.gz gitea-19ae6439b0956a578100b50cb09b1cbd40a01942.zip |
Improve vfsgen to not unzip bindata files but send to browser directly (#7109)
* Don't unzip files from bindata but send to browser directly
* remove dependent for httpgzip
* Add tests for parseAcceptEncoding
* Update docs for ENABLE_GZIP
* Fix bug
* Fix bug
Co-authored-by: zeripath <art27@cantab.net>
Diffstat (limited to 'modules/public/static.go')
-rw-r--r-- | modules/public/static.go | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/modules/public/static.go b/modules/public/static.go index 8da10567ea..c4dd7a1eca 100644 --- a/modules/public/static.go +++ b/modules/public/static.go @@ -7,8 +7,17 @@ package public import ( + "bytes" + "compress/gzip" + "io" "io/ioutil" + "mime" "net/http" + "os" + "path/filepath" + "time" + + "code.gitea.io/gitea/modules/log" ) // Static implements the macaron static handler for serving assets. @@ -49,3 +58,34 @@ func AssetIsDir(name string) (bool, error) { } } } + +// ServeContent serve http content +func ServeContent(w http.ResponseWriter, req *http.Request, fi os.FileInfo, modtime time.Time, content io.ReadSeeker) { + encodings := parseAcceptEncoding(req.Header.Get("Accept-Encoding")) + if encodings["gzip"] { + if cf, ok := fi.(*vfsgen۰CompressedFileInfo); ok { + rd := bytes.NewReader(cf.GzipBytes()) + w.Header().Set("Content-Encoding", "gzip") + ctype := mime.TypeByExtension(filepath.Ext(fi.Name())) + if ctype == "" { + // read a chunk to decide between utf-8 text and binary + var buf [512]byte + grd, _ := gzip.NewReader(rd) + n, _ := io.ReadFull(grd, buf[:]) + ctype = http.DetectContentType(buf[:n]) + _, err := rd.Seek(0, io.SeekStart) // rewind to output whole file + if err != nil { + log.Error("rd.Seek error: %v", err) + http.Error(w, http.StatusText(500), 500) + return + } + } + w.Header().Set("Content-Type", ctype) + http.ServeContent(w, req, fi.Name(), modtime, rd) + return + } + } + + http.ServeContent(w, req, fi.Name(), modtime, content) + return +} |