From 9876071ce28e37782c592d43f41c0394bca214d3 Mon Sep 17 00:00:00 2001 From: chai2010 Date: Sun, 18 Feb 2018 03:27:46 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E6=9C=8D=E5=8A=A1=E8=84=9A?= =?UTF-8?q?=E6=9C=AC,=20=E7=A6=81=E6=AD=A2=E6=9C=AC=E5=9C=B0=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E7=BC=93=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server.go | 45 ++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 44 insertions(+), 1 deletion(-) diff --git a/server.go b/server.go index 252dcf3..0bf15bf 100644 --- a/server.go +++ b/server.go @@ -19,6 +19,7 @@ import ( var ( flagRootDir = flag.String("dir", ".", "root dir") flagHttpAddr = flag.String("http", ":8080", "HTTP service address") + flagNoCache = flag.Bool("no-cache", true, "disable browser cache") flagOpenBrowser = flag.Bool("openbrowser", true, "open browser automatically") ) @@ -47,7 +48,11 @@ func main() { log.Printf("Hit CTRL-C to stop the server\n") }() - log.Fatal(http.ListenAndServe(httpAddr, http.FileServer(http.Dir(*flagRootDir)))) + mainHandler := http.FileServer(http.Dir(*flagRootDir)) + if *flagNoCache { + mainHandler = NoCache(mainHandler) + } + log.Fatal(http.ListenAndServe(httpAddr, mainHandler)) } // waitServer waits some time for the http Server to start @@ -97,3 +102,41 @@ func startBrowser(url string) bool { cmd := exec.Command(args[0], append(args[1:], url)...) return cmd.Start() == nil } + +var epoch = time.Unix(0, 0).Format(time.RFC1123) + +var noCacheHeaders = map[string]string{ + "Expires": epoch, + "Cache-Control": "no-cache, private, max-age=0", + "Pragma": "no-cache", + "X-Accel-Expires": "0", +} + +var etagHeaders = []string{ + "ETag", + "If-Modified-Since", + "If-Match", + "If-None-Match", + "If-Range", + "If-Unmodified-Since", +} + +func NoCache(h http.Handler) http.Handler { + fn := func(w http.ResponseWriter, r *http.Request) { + // Delete any ETag headers that may have been set + for _, v := range etagHeaders { + if r.Header.Get(v) != "" { + r.Header.Del(v) + } + } + + // Set our NoCache headers + for k, v := range noCacheHeaders { + w.Header().Set(k, v) + } + + h.ServeHTTP(w, r) + } + + return http.HandlerFunc(fn) +}