diff options
author | silverwind <me@silverwind.io> | 2020-11-17 23:44:52 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-11-17 17:44:52 -0500 |
commit | 0615b668dcbdeb8819662f2532cd5843f427dbcc (patch) | |
tree | 240a16a14d8ab503c83b75b25617c8275bc450d0 /modules/public | |
parent | 9ec5e6c40b0c0e4a8009acbdd5dfea8c0e60cfcd (diff) | |
download | gitea-0615b668dcbdeb8819662f2532cd5843f427dbcc.tar.gz gitea-0615b668dcbdeb8819662f2532cd5843f427dbcc.zip |
HTTP cache rework and enable caching for storage assets (#13569)
This enabled HTTP time-based cache for storage assets, primarily
avatars. I have not observed If-Modified-Since from browsers during
tests but I guess it's good to support regardless.
It introduces a new generic httpcache module that can handle both
time-based and etag-based caching.
Additionally, manifest.json and robots.txt are now also cachable.
Diffstat (limited to 'modules/public')
-rw-r--r-- | modules/public/public.go | 28 |
1 files changed, 5 insertions, 23 deletions
diff --git a/modules/public/public.go b/modules/public/public.go index 3a2fa4c57c..fc933637d8 100644 --- a/modules/public/public.go +++ b/modules/public/public.go @@ -5,15 +5,13 @@ package public import ( - "encoding/base64" - "fmt" "log" "net/http" "path" "path/filepath" "strings" - "time" + "code.gitea.io/gitea/modules/httpcache" "code.gitea.io/gitea/modules/setting" ) @@ -22,11 +20,8 @@ type Options struct { Directory string IndexFile string SkipLogging bool - // if set to true, will enable caching. Expires header will also be set to - // expire after the defined time. - ExpiresAfter time.Duration - FileSystem http.FileSystem - Prefix string + FileSystem http.FileSystem + Prefix string } // KnownPublicEntries list all direct children in the `public` directory @@ -158,23 +153,10 @@ func (opts *Options) handle(w http.ResponseWriter, req *http.Request, opt *Optio log.Println("[Static] Serving " + file) } - // Add an Expires header to the static content - if opt.ExpiresAfter > 0 { - w.Header().Set("Expires", time.Now().Add(opt.ExpiresAfter).UTC().Format(http.TimeFormat)) - tag := GenerateETag(fmt.Sprint(fi.Size()), fi.Name(), fi.ModTime().UTC().Format(http.TimeFormat)) - w.Header().Set("ETag", tag) - if req.Header.Get("If-None-Match") == tag { - w.WriteHeader(304) - return true - } + if httpcache.HandleEtagCache(req, w, fi) { + return true } http.ServeContent(w, req, file, fi.ModTime(), f) return true } - -// GenerateETag generates an ETag based on size, filename and file modification time -func GenerateETag(fileSize, fileName, modTime string) string { - etag := fileSize + fileName + modTime - return base64.StdEncoding.EncodeToString([]byte(etag)) -} |