Add Cache-Control header

Add Cache-Control response header for static files in order to improve page loading speed.
Fixes  #322
pull/336/head
Josip Antoliš 4 years ago
parent a8a6525006
commit 3f36ede885
  1. 8
      cache.go
  2. 1
      routes.go
  3. 38
      routes_test.go
  4. 1
      testdata/.gitignore
  5. 2
      testdata/config.ini
  6. 3
      testdata/static/style.css

@ -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)
})
}

@ -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)

@ -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)
}
}
}

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

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

@ -0,0 +1,3 @@
body {
background-color: lightblue;
}
Loading…
Cancel
Save