1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

tool/downloader.rb: added Downloader.download_if_modified_since

to reduce downloads of large files that change only rarely.
[ruby-core:65164] [CommonRuby - Feature #10084]

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@47691 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
duerst 2014-09-23 07:08:03 +00:00
parent ab5517a06c
commit 96245d6dd3
2 changed files with 28 additions and 0 deletions

View file

@ -1,3 +1,9 @@
Tue Sep 23 16:07:07 2014 Martin Duerst <duerst@it.aoyama.ac.jp>
* tool/downloader.rb: added Downloader.download_if_modified_since
to reduce downloads of large files that change only rarely.
[ruby-core:65164] [CommonRuby - Feature #10084]
Tue Sep 23 11:55:09 2014 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
* .travis.yml: added rubyspec into travis tasks and eliminate to stdout.

View file

@ -8,4 +8,26 @@ class Downloader
rescue => e
raise "failed to download #{name}\n#{e.message}: #{url}"
end
# Update a file from url if newer version is available.
# Creates the file if the file doesn't yet exist; however, the
# directory where the file is being created has to exist already.
# Example usage:
# download_if_modified_since 'http://www.unicode.org/Public/UCD/latest/ucd/UnicodeData.txt',
# 'enc/unicode/data/UnicodeData.txt'
def self.download_if_modified_since(url, name, dir=nil, since=nil)
file = dir ? File.join(dir, name) : name
since = Date.new(1980,1,1) unless File.exist? file # use very old date to assure file creation
since = File.mtime file unless since # get last modification time for file
since = since.to_datetime if since.respond_to? :to_datetime # convert Time/Date to DateTime
since = since.httpdate if since.respond_to? :httpdate # convert DateTime to String
open(url, 'If-Modified-Since' => since) do |r|
body = r.read
open(file, 'wb', 0755) { |f| f.write(body) }
end
rescue OpenURI::HTTPError => http_error
unless http_error.message =~ /^304 / # 304 Not Modified
raise "Failed to (check for) downloading #{url}: #{http_error.message}"
end
end
end