summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndre Arko <andre@arko.net>2015-03-28 06:12:27 -0700
committerAndre Arko <andre@arko.net>2015-03-28 06:27:06 -0700
commit99a4ef1b43133cc15b8e38c158bee33113c4ae62 (patch)
treec4f709cec0711fc3ebfde7f37667430bd239cf89
parentccb8cf9ac4b255970d23df68013ff1422429207e (diff)
downloadbundler-99a4ef1b43133cc15b8e38c158bee33113c4ae62.tar.gz
extract downloading logic into its own class
-rw-r--r--lib/bundler/fetcher.rb12
-rw-r--r--lib/bundler/fetcher/base.rb53
-rw-r--r--lib/bundler/fetcher/dependency.rb4
-rw-r--r--lib/bundler/fetcher/downloader.rb59
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