lib/sprout/remote_file_loader.rb in sprout-0.7.246-darwin vs lib/sprout/remote_file_loader.rb in sprout-1.0.0.pre
- old
+ new
@@ -1,70 +1,92 @@
+require 'digest/md5'
module Sprout
- class RemoteFileLoaderError < StandardError #:nodoc:
- end
- class RemoteFileLoader #:nodoc:
+ ##
+ # This class is used to load remote files from the network.
+ class RemoteFileLoader
+
+ class << self
- def get_remote_file(uri, force=false, md5=nil)
- response = fetch(uri.to_s)
- if(force || response_is_valid?(response, md5))
- return response
+ def load uri, md5=nil, filename=nil, force=false
+ response = fetch uri.to_s, filename
+ if(force || response_is_valid?(response, md5))
+ return response
+ end
+ nil
end
- end
-
- def response_is_valid?(response, expected_md5sum=nil)
- if(expected_md5sum)
- md5 = Digest::MD5.new
- md5 << response
-
- if(expected_md5sum != md5.hexdigest)
- puts "The MD5 Sum of the downloaded file (#{md5.hexdigest}) does not match what was expected (#{expected_md5sum})."
- puts "Would you like to install anyway? [Yn]"
- response = $stdin.gets.chomp!
- if(response.downcase == 'y')
- return true
- else
- raise RemoteFileLoaderError.new('MD5 Checksum failed')
+
+ private
+
+ def response_is_valid? response, expected_md5sum
+ if(expected_md5sum)
+ md5 = Digest::MD5.new
+ md5 << response
+
+ if(expected_md5sum != md5.hexdigest)
+ return prompt_for_md5_failure md5, expected_md5sum
end
end
+ return true
end
- return true
- end
-
- def fetch(uri)
- uri = URI.parse(uri)
- progress = nil
- response = nil
- name = uri.path.split("/").pop
- begin
- open(uri.to_s, :content_length_proc => lambda {|t|
- if t && t > 0
- progress = ProgressBar.new(name, t)
+ def fetch uri, name=nil
+ begin
+ return open_uri uri, name
+ rescue SocketError => sock_err
+ raise Sprout::Errors::RemoteFileLoaderError.new("[ERROR] #{sock_err.to_s}")
+ rescue OpenURI::HTTPError => http_err
+ raise Sprout::Errors::RemoteFileLoaderError.new("[ERROR] Failed to load file from: '#{uri.to_s}'\n[REMOTE ERROR] #{http_err.io.read.strip}")
+ rescue Errno::ECONNREFUSED => econ_err
+ raise Errno::ECONNREFUSED.new("[ERROR] Connection refused at: '#{uri.to_s}'")
+ end
+ end
+
+ private
+
+ def open_uri uri, name=nil
+ uri = URI.parse(uri)
+ progress = nil
+ response = nil
+ name ||= uri.path.split("/").pop
+
+ # Why was this here? Shouldn't the 'open' command work for other
+ # protocols like https?
+ #
+ #message = "The RemoteFileTask failed for #{name}. We can only handle HTTP requests at this time, it seems you were trying: '#{uri.scheme}'"
+ #raise Sprout::Errors::RemoteFileLoaderError.new(message) if uri.scheme != 'http' || uri.scheme != 'https'
+
+ # This is the strangest implementation I've seen in Ruby yet.
+ # Double lambda arguments with a block to top it off?! Gawsh.
+ open(uri.to_s,
+ :content_length_proc => lambda {|length|
+ length ||= 0
+ progress = Sprout::ProgressBar.new(name, length)
progress.file_transfer_mode
progress.set(0)
- else
- progress = ProgressBar.new(name, 0)
- progress.file_transfer_mode
- progress.set(0)
- end
- },
- :progress_proc => lambda {|s|
- progress.set s if progress
+ },
+ :progress_proc => lambda {|length|
+ progress.set length if progress
}) do |f|
response = f.read
progress.finish
end
- rescue SocketError => sock_err
- raise RemoteFileLoaderError.new("[ERROR] #{sock_err.to_s}")
- rescue OpenURI::HTTPError => http_err
- raise RemoteFileLoaderError.new("[ERROR] Failed to load file from: '#{uri.to_s}'\n[REMOTE ERROR] #{http_err.io.read.strip}")
- rescue Errno::ECONNREFUSED => econ_err
- raise Errno::ECONNREFUSED.new("[ERROR] Connection refused at: '#{uri.to_s}'")
+
+ response
end
- return response
+ def prompt_for_md5_failure md5, expected_md5sum
+ puts "The MD5 Sum of the downloaded file (#{md5.hexdigest}) does not match what was expected (#{expected_md5sum})."
+ puts "Would you like to install anyway? [Yn]"
+ response = $stdin.gets.chomp!
+ if(response.downcase == 'y')
+ return true
+ else
+ raise Sprout::Errors::RemoteFileLoaderError.new('MD5 Checksum failed')
+ end
+ end
+
end
-
end
end
+