@@ -100,9 +100,16 @@ def evict(uri)
100100 Timeout ::Error
101101 ] . freeze
102102
103+ REDIRECT_TYPES = [
104+ Net ::HTTPMovedPermanently ,
105+ Net ::HTTPFound ,
106+ Net ::HTTPSeeOther ,
107+ Net ::HTTPTemporaryRedirect
108+ ] . freeze
109+
103110 TIMEOUT_SECONDS = 10 . freeze
104111
105- private_constant :FAILURE_LIMIT , :HTTP_ERRORS , :TIMEOUT_SECONDS
112+ private_constant :FAILURE_LIMIT , :HTTP_ERRORS , :REDIRECT_TYPES , : TIMEOUT_SECONDS
106113
107114 def attempt ( http , request , cached_file )
108115 downloaded = false
@@ -117,6 +124,8 @@ def attempt(http, request, cached_file)
117124 downloaded = true
118125 elsif response . is_a? Net ::HTTPNotModified
119126 @logger . debug { 'Cached copy up to date' }
127+ elsif redirect? ( response )
128+ downloaded = update URI ( response [ 'Location' ] ) , cached_file
120129 else
121130 fail InferredNetworkFailure , "Bad response: #{ response } "
122131 end
@@ -204,6 +213,10 @@ def proxy(uri)
204213 Net ::HTTP ::Proxy ( proxy_uri . host , proxy_uri . port , proxy_uri . user , proxy_uri . password )
205214 end
206215
216+ def redirect? ( response )
217+ REDIRECT_TYPES . any? { |t | response . is_a? t }
218+ end
219+
207220 def request ( uri , cached_file )
208221 request = Net ::HTTP ::Get . new ( uri . request_uri )
209222
0 commit comments