Problem
No HTTP caching mechanism:
- Every request hits database
- No conditional GET support
- Wasted bandwidth on unchanged data
Proposed Solution
ETag Implementation
func handleGetTask(w http.ResponseWriter, r *http.Request) {
task, _ := store.GetTask(ctx, id)
// Generate ETag from content hash
etag := generateETag(task)
w.Header().Set("ETag", etag)
w.Header().Set("Cache-Control", "private, max-age=60")
// Check If-None-Match
if r.Header.Get("If-None-Match") == etag {
w.WriteHeader(http.StatusNotModified)
return
}
json.NewEncoder(w).Encode(task)
}
func generateETag(v interface{}) string {
data, _ := json.Marshal(v)
hash := sha256.Sum256(data)
return fmt.Sprintf("\"%x\"", hash[:8])
}
Acceptance Criteria
References