diff options
author | wxiaoguang <wxiaoguang@gmail.com> | 2022-01-23 20:19:49 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-01-23 20:19:49 +0800 |
commit | 87141b908d4a03ce27af3ce042dc417da925b84f (patch) | |
tree | e4a5bd11db5ef425fd025971cf21bfc3a587968f /modules/public/static.go | |
parent | 35fdefc1ff253522f101ffb1337437b59676c302 (diff) | |
download | gitea-87141b908d4a03ce27af3ce042dc417da925b84f.tar.gz gitea-87141b908d4a03ce27af3ce042dc417da925b84f.zip |
Fix mime-type detection for HTTP server (#18370)
Bypass the unstable behavior of Golang's mime.TypeByExtension
Diffstat (limited to 'modules/public/static.go')
-rw-r--r-- | modules/public/static.go | 93 |
1 files changed, 0 insertions, 93 deletions
diff --git a/modules/public/static.go b/modules/public/static.go deleted file mode 100644 index d373c712ee..0000000000 --- a/modules/public/static.go +++ /dev/null @@ -1,93 +0,0 @@ -// Copyright 2016 The Gitea Authors. All rights reserved. -// Use of this source code is governed by a MIT-style -// license that can be found in the LICENSE file. - -//go:build bindata -// +build bindata - -package public - -import ( - "bytes" - "compress/gzip" - "io" - "mime" - "net/http" - "os" - "path/filepath" - "time" - - "code.gitea.io/gitea/modules/log" - "code.gitea.io/gitea/modules/timeutil" -) - -// GlobalModTime provide a global mod time for embedded asset files -func GlobalModTime(filename string) time.Time { - return timeutil.GetExecutableModTime() -} - -func fileSystem(dir string) http.FileSystem { - return Assets -} - -func Asset(name string) ([]byte, error) { - f, err := Assets.Open("/" + name) - if err != nil { - return nil, err - } - defer f.Close() - return io.ReadAll(f) -} - -func AssetNames() []string { - realFS := Assets.(vfsgen۰FS) - results := make([]string, 0, len(realFS)) - for k := range realFS { - results = append(results, k[1:]) - } - return results -} - -func AssetIsDir(name string) (bool, error) { - if f, err := Assets.Open("/" + name); err != nil { - return false, err - } else { - defer f.Close() - if fi, err := f.Stat(); err != nil { - return false, err - } else { - return fi.IsDir(), nil - } - } -} - -// 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(http.StatusInternalServerError), http.StatusInternalServerError) - 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 -} |