diff options
Diffstat (limited to 'web/static.go')
-rw-r--r-- | web/static.go | 84 |
1 files changed, 84 insertions, 0 deletions
diff --git a/web/static.go b/web/static.go new file mode 100644 index 000000000..487526fdf --- /dev/null +++ b/web/static.go @@ -0,0 +1,84 @@ +// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. +// See License.txt for license information. + +package web + +import ( + "fmt" + "net/http" + "path/filepath" + "strings" + + "github.com/NYTimes/gziphandler" + + "github.com/mattermost/mattermost-server/mlog" + "github.com/mattermost/mattermost-server/model" + "github.com/mattermost/mattermost-server/utils" +) + +func (w *Web) InitStatic() { + if *w.App.Config().ServiceSettings.WebserverMode != "disabled" { + staticDir, _ := utils.FindDir(model.CLIENT_DIR) + mlog.Debug(fmt.Sprintf("Using client directory at %v", staticDir)) + + staticHandler := staticHandler(http.StripPrefix("/static/", http.FileServer(http.Dir(staticDir)))) + pluginHandler := pluginHandler(w.App.Config, http.StripPrefix("/static/plugins/", http.FileServer(http.Dir(*w.App.Config().PluginSettings.ClientDirectory)))) + + if *w.App.Config().ServiceSettings.WebserverMode == "gzip" { + staticHandler = gziphandler.GzipHandler(staticHandler) + pluginHandler = gziphandler.GzipHandler(pluginHandler) + } + + w.MainRouter.PathPrefix("/static/plugins/").Handler(pluginHandler) + w.MainRouter.PathPrefix("/static/").Handler(staticHandler) + w.MainRouter.Handle("/{anything:.*}", w.NewStaticHandler(root)).Methods("GET") + } +} + +func root(c *Context, w http.ResponseWriter, r *http.Request) { + + if !CheckClientCompatability(r.UserAgent()) { + w.Header().Set("Cache-Control", "no-store") + page := utils.NewHTMLTemplate(c.App.HTMLTemplates(), "unsupported_browser") + page.Props["Title"] = c.T("web.error.unsupported_browser.title") + page.Props["Message"] = c.T("web.error.unsupported_browser.message") + page.RenderToWriter(w) + return + } + + if IsApiCall(r) { + Handle404(c.App, w, r) + return + } + + w.Header().Set("Cache-Control", "no-cache, max-age=31556926, public") + + staticDir, _ := utils.FindDir(model.CLIENT_DIR) + http.ServeFile(w, r, filepath.Join(staticDir, "root.html")) +} + +func staticHandler(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 pluginHandler(config model.ConfigFunc, handler http.Handler) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + if *config().ServiceSettings.EnableDeveloper { + w.Header().Set("Cache-Control", "no-cache, no-store, must-revalidate") + } else { + w.Header().Set("Cache-Control", "max-age=31556926, public") + } + if strings.HasSuffix(r.URL.Path, "/") { + http.NotFound(w, r) + return + } + handler.ServeHTTP(w, r) + }) +} |