diff options
author | Andre Arko <andre@arko.net> | 2015-03-28 06:12:27 -0700 |
---|---|---|
committer | Andre Arko <andre@arko.net> | 2015-03-28 06:27:06 -0700 |
commit | 99a4ef1b43133cc15b8e38c158bee33113c4ae62 (patch) | |
tree | c4f709cec0711fc3ebfde7f37667430bd239cf89 | |
parent | ccb8cf9ac4b255970d23df68013ff1422429207e (diff) | |
download | bundler-99a4ef1b43133cc15b8e38c158bee33113c4ae62.tar.gz |
extract downloading logic into its own class
-rw-r--r-- | lib/bundler/fetcher.rb | 12 | ||||
-rw-r--r-- | lib/bundler/fetcher/base.rb | 53 | ||||
-rw-r--r-- | lib/bundler/fetcher/dependency.rb | 4 | ||||
-rw-r--r-- | lib/bundler/fetcher/downloader.rb | 59 |
4 files changed, 73 insertions, 55 deletions
diff --git a/lib/bundler/fetcher.rb b/lib/bundler/fetcher.rb index 536e2a1179..5dbc0d3bfd 100644 --- a/lib/bundler/fetcher.rb +++ b/lib/bundler/fetcher.rb @@ -1,6 +1,7 @@ +require 'bundler/fetcher/downloader' require 'bundler/vendored_persistent' -require 'securerandom' require 'cgi' +require 'securerandom' module Bundler @@ -130,7 +131,7 @@ module Bundler elsif cached_spec_path = gemspec_cached_path(spec_file_name) Bundler.load_gemspec(cached_spec_path) else - Bundler.load_marshal Gem.inflate(fetchers.first.fetch uri) + Bundler.load_marshal Gem.inflate(downloader.fetch uri) end rescue MarshalError raise HTTPError, "Gemspec #{spec} contained invalid data.\n" \ @@ -188,7 +189,7 @@ module Bundler end def fetchers - @fetchers ||= FETCHERS.map { |f| f.new(connection, remote_uri, fetch_uri, uri) } + @fetchers ||= FETCHERS.map { |f| f.new(downloader, remote_uri, fetch_uri, uri) } end private @@ -269,5 +270,10 @@ module Bundler def remote_uri @remote.uri end + + def downloader + @downloader ||= Downloader.new(connection) + end + end end diff --git a/lib/bundler/fetcher/base.rb b/lib/bundler/fetcher/base.rb index f81272eecd..31d6f8a09b 100644 --- a/lib/bundler/fetcher/base.rb +++ b/lib/bundler/fetcher/base.rb @@ -1,14 +1,14 @@ module Bundler class Fetcher class Base - attr_reader :connection + attr_reader :downloader attr_reader :remote_uri attr_reader :fetch_uri attr_reader :display_uri - def initialize(connection, remote_uri, fetch_uri, display_uri) + def initialize(downloader, remote_uri, fetch_uri, display_uri) raise 'Abstract class' if self.class == Base - @connection = connection + @downloader = downloader @remote_uri = remote_uri @fetch_uri = fetch_uri @display_uri = display_uri @@ -22,53 +22,6 @@ module Bundler false end - def fetch(uri, counter = 0) - raise HTTPError, "Too many redirects" if counter >= Fetcher.redirect_limit - - response = request(uri) - Bundler.ui.debug("HTTP #{response.code} #{response.message}") - - case response - when Net::HTTPRedirection - new_uri = URI.parse(response["location"]) - if new_uri.host == uri.host - new_uri.user = uri.user - new_uri.password = uri.password - end - fetch(new_uri, counter + 1) - when Net::HTTPSuccess - response.body - when Net::HTTPRequestEntityTooLarge - raise FallbackError, response.body - when Net::HTTPUnauthorized - raise AuthenticationRequiredError, remote_uri.host - else - raise HTTPError, "#{response.class}: #{response.body}" - end - end - - def request(uri) - Bundler.ui.debug "HTTP GET #{uri}" - req = Net::HTTP::Get.new uri.request_uri - if uri.user - user = CGI.unescape(uri.user) - password = uri.password ? CGI.unescape(uri.password) : nil - req.basic_auth(user, password) - end - connection.request(uri, req) - rescue OpenSSL::SSL::SSLError - raise CertificateFailureError.new(uri) - rescue *HTTP_ERRORS => e - Bundler.ui.trace e - case e.message - when /host down:/, /getaddrinfo: nodename nor servname provided/ - raise NetworkDownError, "Could not reach host #{uri.host}. Check your network " \ - "connection and try again." - else - raise HTTPError, "Network error while fetching #{uri}" - end - end - end end end diff --git a/lib/bundler/fetcher/dependency.rb b/lib/bundler/fetcher/dependency.rb index 5e7539779d..ca36dcb53f 100644 --- a/lib/bundler/fetcher/dependency.rb +++ b/lib/bundler/fetcher/dependency.rb @@ -4,7 +4,7 @@ module Bundler class Fetcher class Dependency < Base def api_available? - fetch(dependency_api_uri) + downloader.fetch(dependency_api_uri) rescue NetworkDownError => e raise HTTPError, e.message rescue AuthenticationRequiredError @@ -48,7 +48,7 @@ module Bundler deps_list = [] gem_names.each_slice(Source::Rubygems::API_REQUEST_SIZE) do |names| - marshalled_deps = fetch dependency_api_uri(names) + marshalled_deps = downloader.fetch dependency_api_uri(names) gem_list += Bundler.load_marshal(marshalled_deps) end diff --git a/lib/bundler/fetcher/downloader.rb b/lib/bundler/fetcher/downloader.rb new file mode 100644 index 0000000000..67f932b2c3 --- /dev/null +++ b/lib/bundler/fetcher/downloader.rb @@ -0,0 +1,59 @@ +module Bundler + class Fetcher + class Downloader + attr_reader :connection + + def initialize(connection) + @connection = connection + end + + def fetch(uri, counter = 0) + raise HTTPError, "Too many redirects" if counter >= Fetcher.redirect_limit + + response = request(uri) + Bundler.ui.debug("HTTP #{response.code} #{response.message}") + + case response + when Net::HTTPRedirection + new_uri = URI.parse(response["location"]) + if new_uri.host == uri.host + new_uri.user = uri.user + new_uri.password = uri.password + end + fetch(new_uri, counter + 1) + when Net::HTTPSuccess + response.body + when Net::HTTPRequestEntityTooLarge + raise FallbackError, response.body + when Net::HTTPUnauthorized + raise AuthenticationRequiredError, uri.host + else + raise HTTPError, "#{response.class}: #{response.body}" + end + end + + def request(uri) + Bundler.ui.debug "HTTP GET #{uri}" + req = Net::HTTP::Get.new uri.request_uri + if uri.user + user = CGI.unescape(uri.user) + password = uri.password ? CGI.unescape(uri.password) : nil + req.basic_auth(user, password) + end + connection.request(uri, req) + rescue OpenSSL::SSL::SSLError + raise CertificateFailureError.new(uri) + rescue *HTTP_ERRORS => e + Bundler.ui.trace e + case e.message + when /host down:/, /getaddrinfo: nodename nor servname provided/ + raise NetworkDownError, "Could not reach host #{uri.host}. Check your network " \ + "connection and try again." + else + raise HTTPError, "Network error while fetching #{uri}" + end + end + + end + end +end
\ No newline at end of file |