1

私のオブジェクトGETは、HTTP 経由のファイルです。

これは、If-Modified-Sinceヘッダーを使用して行います。ヘッダーの時刻以降にファイルが変更されていない場合、Not Modified 応答が返され、ファイルをフェッチして書き込むことはできません。そのようです:

class YouTube
  #...
  def parse
    uri = URI("http://i.ytimg.com/vi/#{@id}/0.jpg")
    req = Net::HTTP::Get.new(uri.request_uri)
    if File.exists? thumbname
      stat = File.stat thumbname
      req['If-Modified-Since'] = stat.mtime.rfc2822
    end

    res = Net::HTTP.start(uri.hostname, uri.port) {|http|
      http.request(req)
    }

    File.open(thumbname, 'wb') do |f|
      f.write res.body
    end if res.is_a?(Net::HTTPSuccess)
  end
  #...
end

両方のケースをテストしたい (どちらの場合も、ディスク上にファイルが存在する)。そのためには、 で何かをスタブ化するかNet::HTTP、File.stat をスタブ化しmtimeて、オンライン リソースが new または Not-modified-since を返すことが確実な を返す必要があります。

スタブ (またはモック) する必要がありNet::HTTPますか? もしそうなら、何?

または、Not-modified ヘッダーを強制または抑制するために、スタブを作成mtimeして、はるか過去またははるか未来の日付を返す必要がありますか?


編集:問題をさらに掘り下げて、i.ytimg.comドメインがこれらのヘッダーをサポートしていないことを知りました。したがって、YouTube API から JSON を検査して、これを解決する必要があります。ただし、「if-modified-since-headers をテストするときに何をどのようにモックするか」という問題は依然として残っています。

ドメインがこれをサポートしていないと結論付ける方法は次のとおりです。

$curl -I --header 'If-Modified-Since: Sun, 24 Mar 2013 17:33:29 +0100' -L http://i.ytimg.com/vi/D80QdsFWdcQ/0.jpg
HTTP/1.1 200 OK
Content-Type: image/jpeg
Date: Sun, 24 Mar 2013 16:31:10 GMT
Expires: Sun, 24 Mar 2013 22:31:10 GMT
X-Content-Type-Options: nosniff
Server: sffe
Content-Length: 13343
X-XSS-Protection: 1; mode=block
Cache-Control: public, max-age=21600
Age: 822

そこには「最終更新日」はありません。if-modified-since ヘッダーをサポートする exaple.com への別の呼び出しで示されています。

$curl -I --header 'If-Modified-Since: Sun, 24 Mar 2013 17:33:29 +0100' -L example.com
HTTP/1.0 302 Found
Location: http://www.iana.org/domains/example/
Server: BigIP
Connection: Keep-Alive
Content-Length: 0

HTTP/1.1 302 FOUND
Date: Sun, 24 Mar 2013 16:47:47 GMT
Server: Apache/2.2.3 (CentOS)
Location: http://www.iana.org/domains/example
Connection: close
Content-Type: text/html; charset=utf-8

HTTP/1.1 304 NOT MODIFIED
Date: Sun, 24 Mar 2013 16:47:47 GMT
Server: Apache/2.2.3 (CentOS)
Connection: close
4

0 に答える 0