HTTP GETでサーバ側キャッシュ無効化

Ruby標準添付ライブラリRSS::Parserでは、RSS::Parser.parse(url) という形で直接HTTP経由でRSSフィードを読み込むこともできますが、少なくともはてなブックマークRSSでは、サーバ側キャッシュの影響で、最新のエントリが取得できないケースがあるようです。

wgetコマンドでは --no-cache というオプションがあり、これを指定すると期待通り最新のエントリを取得できるので、HTTPリクエストヘッダでキャッシュ無効化 (Cache-Control: no-cacheあるいはPragma: no-cache) を指定すれば期待通りの挙動になりそうです。

RSS::Parser.parserではHTTPリクエストヘッダを指定する手段はないようですが、ひとまずNet::HTTPやopen-uriでは任意のヘッダを指定できるので、これらのライブラリを試してみました。結論としてはどちらもOK。RSS::Parserへの入力として使う目的では、どちらでも大差はなさそうです。

情報源:

Net::HTTP

require 'net/http'

response = nil

Net::HTTP.version_1_2
Net::HTTP.start('b.hatena.ne.jp') {|http|
  response = http.get(<パス>, 
    {'Cache-Control' => 'no-cache', 'Pragma' => 'no-cache'})
}
print response.body if response.kind_of?(Net::HTTPOK)

open-uri

require 'open-uri'

result = nil
open(<URL>, {'Cache-Control' => 'no-cache', 'Pragma' => 'no-cache'} {|f|
  result = f.read
}
print result