On Feb 22, 1:31 pm, Tim Haines <tmhai...@gmail.com> wrote: > The Twitter API returns ETags, that seem to change when the content > changes and otherwise not. It doesn't seem to return 304's when the > same ETag is sent back to it though. > > Has anyone seen it send 304s?
The API always seem to return no-cache and past expiry headers, it *does* send 304's when you pass the etag in a "If-None-Match" header: $ curl --head http://twitter.com/users/show.xml?screen_name=philoye HTTP/1.1 200 OK Date: Wed, 24 Feb 2010 01:13:10 GMT Server: hi X-RateLimit-Limit: 150 X-Transaction: 1266973990-97869-341 Status: 200 OK ETag: "3022db84cebe898b561a397c20063f5e" Last-Modified: Wed, 24 Feb 2010 01:13:10 GMT X-RateLimit-Remaining: 136 X-Runtime: 0.02109 Content-Type: application/xml; charset=utf-8 Pragma: no-cache Content-Length: 2057 X-RateLimit-Class: api Cache-Control: no-cache, no-store, must-revalidate, pre-check=0, post- check=0 Expires: Tue, 31 Mar 1981 05:00:00 GMT X-Revision: DEV X-RateLimit-Reset: 1266976693 Set-Cookie: _twitter_sess=BAh7CDoRdHJhbnNfcHJvbXB0MDoHaWQiJTA0MWYzMTQyNGZjMjU5MTJlYWQz %250AOWU1MzhhMmYxZTkzIgpmbGFzaElDOidBY3Rpb25Db250cm9sbGVyOjpGbGFz %250AaDo6Rmxhc2hIYXNoewAGOgpAdXNlZHsA-- ba31f1ea9e0800e1b4c3d564484c8fdf6885183d; domain=.twitter.com; path=/ Vary: Accept-Encoding Connection: close $ curl --head --header 'If-None-Match: "3022db84cebe898b561a397c20063f5e"' http://twitter.com/users/show.xml?screen_name=philoye HTTP/1.1 304 Not Modified Date: Wed, 24 Feb 2010 01:13:41 GMT Server: hi Connection: close ETag: "3022db84cebe898b561a397c20063f5e" Expires: Tue, 31 Mar 1981 05:00:00 GMT Cache-Control: no-cache, no-store, must-revalidate, pre-check=0, post- check=0 Vary: Accept-Encoding Set-Cookie: _twitter_sess=BAh7CDoHaWQiJTRiYTlkN2RlODVhN2NlNmMzMWM3MWY4Y2FhNGUwZjc4Igpm %250AbGFzaElDOidBY3Rpb25Db250cm9sbGVyOjpGbGFzaDo6Rmxhc2hIYXNoewAG %250AOgpAdXNlZHsAOhF0cmFuc19wcm9tcHQw-- fce6e5410dc71d9720ac35c5470bc7220e8b4ceb; domain=.twitter.com; path=/ The key is to send the ETag in a If-None-Match header, not an ETag header. I still don't understand why the Cache-Control and Expires headers are set this way though. Cheers, p.