When a matching cache entry is found and is fresh, it uses it as the
response without forwarding any request to the backend. When a matching
cache entry is found but is stale, it attempts to "validate" the entry with
the backend using conditional GET. When no matching cache entry is found,
it triggers "miss" processing.