# File lib/bundler/fetcher/downloader.rb, line 12
      def fetch(uri, counter = 0)
        raise HTTPError, "Too many redirects" if counter >= 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