def _download_snap(self, name, channel, arch, download_path, download_url, expected_sha512): if self._is_downloaded(download_path, expected_sha512): logger.info('Already downloaded {} at {}'.format( name, download_path)) return logger.info('Downloading {}'.format(name, download_path)) # HttpAdapter cannot help here as this is a stream. # LP: #1617765 not_downloaded = True retry_count = 5 while not_downloaded and retry_count: request = self.cpi.get(download_url, stream=True) request.raise_for_status() try: download_requests_stream(request, download_path) not_downloaded = False except requests.exceptions.ChunkedEncodingError as e: retry_count -= 1 if not retry_count: raise e sleep(1) if self._is_downloaded(download_path, expected_sha512): logger.info('Successfully downloaded {} at {}'.format( name, download_path)) else: raise errors.SHAMismatchError(download_path, expected_sha512)
def _download_snap(self, name, channel, arch, download_path, download_url, expected_sha512): if self._is_downloaded(download_path, expected_sha512): logger.info('Already downloaded {} at {}'.format( name, download_path)) return logger.info('Downloading {}'.format(name, download_path)) # we only resume when redirected to our CDN since we use internap's # special sauce. resume_possible = False total_read = 0 probe_url = requests.head(download_url) if (probe_url.is_redirect and 'internap' in probe_url.headers['Location']): download_url = probe_url.headers['Location'] resume_possible = True # HttpAdapter cannot help here as this is a stream. # LP: #1617765 not_downloaded = True retry_count = 5 while not_downloaded and retry_count: headers = {} if resume_possible and os.path.exists(download_path): total_read = os.path.getsize(download_path) headers['Range'] = 'bytes={}-'.format(total_read) request = self.cpi.get(download_url, headers=headers, stream=True) request.raise_for_status() redirections = [h.headers['Location'] for h in request.history] if redirections: logger.debug('Redirections for {!r}: {}'.format( download_url, ', '.join(redirections))) try: download_requests_stream(request, download_path, total_read=total_read) not_downloaded = False except requests.exceptions.ChunkedEncodingError as e: logger.debug('Error while downloading: {!r}. ' 'Retries left to download: {!r}.'.format( e, retry_count)) retry_count -= 1 if not retry_count: raise e sleep(1) if self._is_downloaded(download_path, expected_sha512): logger.info('Successfully downloaded {} at {}'.format( name, download_path)) else: raise errors.SHAMismatchError(download_path, expected_sha512)
def _download_snap(self, name, channel, arch, download_path, download_url, expected_sha512): if self._is_downloaded(download_path, expected_sha512): logger.info('Already downloaded {} at {}'.format( name, download_path)) return logger.info('Downloading {}'.format(name, download_path)) request = self.cpi.get(download_url, stream=True) request.raise_for_status() download_requests_stream(request, download_path) if self._is_downloaded(download_path, expected_sha512): logger.info('Successfully downloaded {} at {}'.format( name, download_path)) else: raise errors.SHAMismatchError(download_path, expected_sha512)
def _download_snap(self, name, channel, arch, download_path, download_url, expected_sha512): if self._is_downloaded(download_path, expected_sha512): logger.info('Already downloaded {} at {}'.format( name, download_path)) return logger.info('Downloading {}'.format(name, download_path)) # FIXME: Check the status code ! -- vila 2016-05-04 download = self.cpi.get(download_url) with open(download_path, 'wb') as f: # FIXME: Cough, we may want to buffer here (and a progress bar # would be nice) -- vila 2016-04-26 f.write(download.content) if self._is_downloaded(download_path, expected_sha512): logger.info('Successfully downloaded {} at {}'.format( name, download_path)) else: raise errors.SHAMismatchError(download_path, expected_sha512)