diff options
-rw-r--r-- | ChangeLog | 6 | ||||
-rw-r--r-- | tool/downloader.rb | 22 |
2 files changed, 28 insertions, 0 deletions
@@ -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. diff --git a/tool/downloader.rb b/tool/downloader.rb index 03d26eaa5f..7c29132d7b 100644 --- a/tool/downloader.rb +++ b/tool/downloader.rb @@ -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 |