generate etag header if not already set. check cache freshness and return 304 if fresh.