MM-20948: nocache for static plugin assets (#13322)

Serve static plugin assets with a `Cache-Control: no-cache, public` header. This avoids caching a 404 response for such an asset, preventing it from being loaded until expiry even if the file later becomes available.

This is currently preventing updates of plugins on community and would generally affect any customer with a cache in front of the Mattermost servers.

Fixes: https://mattermost.atlassian.net/browse/MM-20948
Этот коммит содержится в:
Jesse Hallam
2019-12-05 23:57:30 -04:00
коммит произвёл GitHub
родитель d3a1a37f93
Коммит 345b0c560a
2 изменённых файлов: 103 добавлений и 1 удалений

Просмотреть файл

@@ -34,7 +34,7 @@ func (w *Web) InitStatic() {
mime.AddExtensionType(".wasm", "application/wasm")
staticHandler := staticFilesHandler(http.StripPrefix(path.Join(subpath, "static"), http.FileServer(http.Dir(staticDir))))
pluginHandler := staticFilesHandler(http.StripPrefix(path.Join(subpath, "static", "plugins"), http.FileServer(http.Dir(*w.ConfigService.Config().PluginSettings.ClientDirectory))))
pluginHandler := staticFilesWithValidationHandler(http.StripPrefix(path.Join(subpath, "static", "plugins"), http.FileServer(http.Dir(*w.ConfigService.Config().PluginSettings.ClientDirectory))))
if *w.ConfigService.Config().ServiceSettings.WebserverMode == "gzip" {
staticHandler = gziphandler.GzipHandler(staticHandler)
@@ -78,6 +78,21 @@ func root(c *Context, w http.ResponseWriter, r *http.Request) {
func staticFilesHandler(handler http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Cache-Control", "max-age=31556926, public")
if strings.HasSuffix(r.URL.Path, "/") {
http.NotFound(w, r)
return
}
handler.ServeHTTP(w, r)
})
}
func staticFilesWithValidationHandler(handler http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
// Require validation from any cache, achieved via Last-Modified and the
// http.FileServer.
w.Header().Set("Cache-Control", "no-cache, public")
if strings.HasSuffix(r.URL.Path, "/") {
http.NotFound(w, r)
return