我的对象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
,我确定在线资源将返回新的或不是修饰的,因为。
我应该存根(甚至模拟)Net::HTTP
吗?如果是的话,是什么?
或者我应该将mtime
存根以返回过去或将来远的日期来强制执行或取消未经修改的标题?
编辑:深入了解此事,我了解到 i.ytimg.com -domain不支持这些标头。所以我需要通过从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
那里没有“Last-Modified”。通过另一个调用说明exaple.com,它支持if-modified-since标题。
$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