Add noHttpCache to hugo server
authorBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Fri, 22 Sep 2017 15:13:21 +0000 (17:13 +0200)
committerBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Fri, 22 Sep 2017 15:13:21 +0000 (17:13 +0200)
Fixes #3897

commands/server.go

index 89d5c239e4228de08b97b42f8b91ea9b65b5efce..b6983c704d6bae50d1515ff1c952b0709847beeb 100644 (file)
@@ -39,6 +39,7 @@ var (
        serverInterface   string
        serverPort        int
        serverWatch       bool
+       noHttpCache       bool
 )
 
 var serverCmd = &cobra.Command{
@@ -86,6 +87,7 @@ func init() {
        serverCmd.Flags().IntVarP(&serverPort, "port", "p", 1313, "port on which the server will listen")
        serverCmd.Flags().StringVarP(&serverInterface, "bind", "", "127.0.0.1", "interface to which the server will bind")
        serverCmd.Flags().BoolVarP(&serverWatch, "watch", "w", true, "watch filesystem for changes and recreate as needed")
+       serverCmd.Flags().BoolVar(&noHttpCache, "noHttpCache", false, "prevent HTTP caching")
        serverCmd.Flags().BoolVarP(&serverAppend, "appendPort", "", true, "append port to baseURL")
        serverCmd.Flags().BoolVar(&disableLiveReload, "disableLiveReload", false, "watch without enabling live browser reload on rebuild")
        serverCmd.Flags().BoolVar(&navigateToChanged, "navigateToChanged", false, "navigate to changed content file on live browser reload")
@@ -205,7 +207,17 @@ func (c *commandeer) serve(port int) {
 
        httpFs := afero.NewHttpFs(c.Fs.Destination)
        fs := filesOnlyFs{httpFs.Dir(c.PathSpec().AbsPathify(c.Cfg.GetString("publishDir")))}
-       fileserver := http.FileServer(fs)
+       decorate := func(h http.Handler) http.Handler {
+               return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+                       if noHttpCache {
+                               w.Header().Set("Cache-Control", " no-store, no-cache, must-revalidate, max-age=0")
+                               w.Header().Set("Pragma", "no-cache")
+                       }
+                       h.ServeHTTP(w, r)
+               })
+       }
+
+       fileserver := decorate(http.FileServer(fs))
 
        // We're only interested in the path
        u, err := url.Parse(c.Cfg.GetString("baseURL"))