| Class | Gem::RemoteFetcher |
| In: |
lib/rubygems/remote_fetcher.rb
|
| Parent: | Object |
RemoteFetcher handles the details of fetching gems and gem information from a remote source.
Cached RemoteFetcher instance.
# File lib/rubygems/remote_fetcher.rb, line 19
19: def self.fetcher
20: @fetcher ||= self.new Gem.configuration[:http_proxy]
21: end
Initialize a remote fetcher using the source URI and possible proxy information.
proxy
variable setting
HTTP_PROXY_PASS)
# File lib/rubygems/remote_fetcher.rb, line 32
32: def initialize(proxy)
33: Socket.do_not_reverse_lookup = true
34:
35: @connections = {}
36: @requests = Hash.new 0
37: @proxy_uri =
38: case proxy
39: when :no_proxy then nil
40: when nil then get_proxy_from_env
41: when URI::HTTP then proxy
42: else URI.parse(proxy)
43: end
44: end
Moves the gem spec from source_uri to the cache dir unless it is already there. If the source_uri is local the gem cache dir copy is always replaced.
# File lib/rubygems/remote_fetcher.rb, line 50
50: def download(spec, source_uri, install_dir = Gem.dir)
51: gem_file_name = "#{spec.full_name}.gem"
52: local_gem_path = File.join install_dir, 'cache', gem_file_name
53:
54: Gem.ensure_gem_subdirectories install_dir
55:
56: source_uri = URI.parse source_uri unless URI::Generic === source_uri
57: scheme = source_uri.scheme
58:
59: # URI.parse gets confused by MS Windows paths with forward slashes.
60: scheme = nil if scheme =~ /^[a-z]$/i
61:
62: case scheme
63: when 'http' then
64: unless File.exist? local_gem_path then
65: begin
66: say "Downloading gem #{gem_file_name}" if
67: Gem.configuration.really_verbose
68:
69: remote_gem_path = source_uri + "gems/#{gem_file_name}"
70:
71: gem = Gem::RemoteFetcher.fetcher.fetch_path remote_gem_path
72: rescue Gem::RemoteFetcher::FetchError
73: raise if spec.original_platform == spec.platform
74:
75: alternate_name = "#{spec.original_name}.gem"
76:
77: say "Failed, downloading gem #{alternate_name}" if
78: Gem.configuration.really_verbose
79:
80: remote_gem_path = source_uri + "gems/#{alternate_name}"
81:
82: gem = Gem::RemoteFetcher.fetcher.fetch_path remote_gem_path
83: end
84:
85: File.open local_gem_path, 'wb' do |fp|
86: fp.write gem
87: end
88: end
89: when nil, 'file' then # TODO test for local overriding cache
90: begin
91: FileUtils.cp source_uri.to_s, local_gem_path
92: rescue Errno::EACCES
93: local_gem_path = source_uri.to_s
94: end
95:
96: say "Using local gem #{local_gem_path}" if
97: Gem.configuration.really_verbose
98: else
99: raise Gem::InstallError, "unsupported URI scheme #{source_uri.scheme}"
100: end
101:
102: local_gem_path
103: end
Downloads uri.
# File lib/rubygems/remote_fetcher.rb, line 106
106: def fetch_path(uri)
107: open_uri_or_path(uri) do |input|
108: input.read
109: end
110: rescue Timeout::Error
111: raise FetchError, "timed out fetching #{uri}"
112: rescue IOError, SocketError, SystemCallError => e
113: raise FetchError, "#{e.class}: #{e} reading #{uri}"
114: rescue => e
115: message = "#{e.class}: #{e} reading #{uri}"
116: raise FetchError, message
117: end
Returns the size of uri in bytes.
# File lib/rubygems/remote_fetcher.rb, line 120
120: def fetch_size(uri)
121: return File.size(get_file_uri_path(uri)) if file_uri? uri
122:
123: uri = URI.parse uri unless URI::Generic === uri
124:
125: raise ArgumentError, 'uri is not an HTTP URI' unless URI::HTTP === uri
126:
127: http = connect_to uri.host, uri.port
128:
129: request = Net::HTTP::Head.new uri.request_uri
130:
131: request.basic_auth unescape(uri.user), unescape(uri.password) unless
132: uri.user.nil? or uri.user.empty?
133:
134: resp = http.request request
135:
136: if resp.code !~ /^2/ then
137: raise Gem::RemoteSourceException,
138: "HTTP Response #{resp.code} fetching #{uri}"
139: end
140:
141: if resp['content-length'] then
142: return resp['content-length'].to_i
143: else
144: resp = http.get uri.request_uri
145: return resp.body.size
146: end
147:
148: rescue SocketError, SystemCallError, Timeout::Error => e
149: raise Gem::RemoteFetcher::FetchError,
150: "#{e.message} (#{e.class})\n\tgetting size of #{uri}"
151: end