Add Cache-Control header

Add Cache-Control response header for static files in order to improve page loading speed.
Fixes  #322
This commit is contained in:
Josip Antoliš 2020-07-21 23:41:00 +02:00
parent a8a6525006
commit 3f36ede885
6 changed files with 53 additions and 0 deletions

View file

@ -11,6 +11,7 @@
package writefreely package writefreely
import ( import (
"net/http"
"sync" "sync"
"time" "time"
) )
@ -67,3 +68,10 @@ func GetPostsCache(userID int64) *[]PublicPost {
} }
return pci.Posts return pci.Posts
} }
func cacheControl(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Cache-Control", "public, max-age=604800, immutable")
next.ServeHTTP(w, r)
})
}

View file

@ -26,6 +26,7 @@ import (
func (app *App) InitStaticRoutes(r *mux.Router) { func (app *App) InitStaticRoutes(r *mux.Router) {
// Handle static files // Handle static files
fs := http.FileServer(http.Dir(filepath.Join(app.cfg.Server.StaticParentDir, staticDir))) fs := http.FileServer(http.Dir(filepath.Join(app.cfg.Server.StaticParentDir, staticDir)))
fs = cacheControl(fs)
app.shttp = http.NewServeMux() app.shttp = http.NewServeMux()
app.shttp.Handle("/", fs) app.shttp.Handle("/", fs)
r.PathPrefix("/").Handler(fs) r.PathPrefix("/").Handler(fs)

38
routes_test.go Normal file
View file

@ -0,0 +1,38 @@
package writefreely
import (
"net/http"
"net/http/httptest"
"strings"
"testing"
"github.com/gorilla/mux"
)
func TestCacheControlForStaticFiles(t *testing.T) {
app := NewApp("testdata/config.ini")
if err := app.LoadConfig(); err != nil {
t.Fatalf("Could not create an app; %v", err)
}
router := mux.NewRouter()
app.InitStaticRoutes(router)
rec := httptest.NewRecorder()
req := httptest.NewRequest("GET", "/style.css", nil)
router.ServeHTTP(rec, req)
if code := rec.Result().StatusCode; code != http.StatusOK {
t.Fatalf("Could not get /style.css, got HTTP status %d", code)
}
actual := rec.Result().Header.Get("Cache-Control")
expectedDirectives := []string{
"public",
"max-age",
"immutable",
}
for _, expected := range expectedDirectives {
if !strings.Contains(actual, expected) {
t.Errorf("Expected Cache-Control header to contain '%s', but was '%s'", expected, actual)
}
}
}

1
testdata/.gitignore vendored Normal file
View file

@ -0,0 +1 @@
!config.ini

2
testdata/config.ini vendored Normal file
View file

@ -0,0 +1,2 @@
[server]
static_parent_dir = testdata

3
testdata/static/style.css vendored Normal file
View file

@ -0,0 +1,3 @@
body {
background-color: lightblue;
}