implement client side caching via Etags