web-server/cache.go

38 lines
716 B
Go

package main
import (
"net/http"
)
type cacheEntry struct {
r Response
}
func Cache(h http.Handler) http.Handler {
c := make(map[string]cacheEntry)
return http.HandlerFunc(func(rw http.ResponseWriter, r *http.Request) {
if r.Method != "GET" {
rw.WriteHeader(403)
rw.Write([]byte("invalid request type"))
return
}
entry, exists := c[r.URL.String()]
if exists {
entry.r.WriteResponse(rw)
} else {
rc := ResponseCollector{}
// copy request in case they modify it
req := *r
h.ServeHTTP(&rc, &req)
resp := rc.CollectResponse()
if resp.Code == 200 {
c[r.URL.String()] = cacheEntry{resp}
}
resp.WriteResponse(rw)
}
// TODO bookkeeping for the cache here
})
}