def download_package(context, request): """Download package, or redirect to the download link""" package = request.db.fetch(context.filename) if not package: if request.registry.fallback != "cache": return HTTPNotFound() if not request.access.can_update_cache(): return request.forbid() # If we are caching pypi, download the package from pypi and save it releases = request.locator.get_releases(context.name) dist = None for release in releases: if posixpath.basename(release["url"]) == context.filename: dist = release break if dist is None: return HTTPNotFound() LOG.info("Caching %s from %s", context.filename, request.fallback_simple) package, data = fetch_dist( request, dist["url"], dist["name"], dist["version"], dist["summary"], dist["requires_python"], ) disp = CONTENT_DISPOSITION.tuples(filename=package.filename) request.response.headers.update(disp) cache_control = CACHE_CONTROL.tuples( public=True, max_age=request.registry.package_max_age ) request.response.headers.update(cache_control) request.response.body = data request.response.content_type = "application/octet-stream" return request.response if request.registry.stream_files: with request.db.storage.open(package) as data: request.response.body = data.read() disp = CONTENT_DISPOSITION.tuples(filename=package.filename) request.response.headers.update(disp) cache = CACHE_CONTROL.tuples( public=True, max_age=request.registry.package_max_age ) request.response.headers.update(cache) request.response.content_type = "application/octet-stream" return request.response response = request.db.download_response(package) return response
def download_package(context, request): """ Download package, or redirect to the download link """ package = request.db.fetch(context.filename) if not package: if request.registry.fallback != "cache": return HTTPNotFound() if not request.access.can_update_cache(): return request.forbid() # If we are caching pypi, download the package from pypi and save it dists = request.locator.get_project(context.name) dist = None source_url = None for version, url_set in six.iteritems(dists.get("urls", {})): if dist is not None: break for url in url_set: if posixpath.basename(url) == context.filename: source_url = url dist = dists[version] break if dist is None: return HTTPNotFound() LOG.info("Caching %s from %s", context.filename, request.fallback_simple) package, data = fetch_dist(request, dist.name, source_url) disp = CONTENT_DISPOSITION.tuples(filename=package.filename) request.response.headers.update(disp) cache_control = CACHE_CONTROL.tuples( public=True, max_age=request.registry.package_max_age ) request.response.headers.update(cache_control) request.response.body = data request.response.content_type = "application/octet-stream" return request.response if request.registry.stream_files: with request.db.storage.open(package) as data: request.response.body = data.read() disp = CONTENT_DISPOSITION.tuples(filename=package.filename) request.response.headers.update(disp) cache = CACHE_CONTROL.tuples( public=True, max_age=request.registry.package_max_age ) request.response.headers.update(cache) request.response.content_type = "application/octect-stream" return request.response response = request.db.download_response(package) return response
def download_package(context, request): """ Download package, or redirect to the download link """ package = request.db.fetch(context.filename) if not package: if request.registry.fallback != "cache": return HTTPNotFound() if not request.access.can_update_cache(): return request.forbid() # If we are caching pypi, download the package from pypi and save it dists = request.locator.get_project(context.name) dist = None source_url = None for version, url_set in six.iteritems(dists.get("urls", {})): if dist is not None: break for url in url_set: if posixpath.basename(url) == context.filename: source_url = url dist = dists[version] break if dist is None: return HTTPNotFound() LOG.info("Caching %s from %s", context.filename, request.fallback_simple) package, data = fetch_dist(request, dist.name, source_url) disp = CONTENT_DISPOSITION.tuples(filename=package.filename) request.response.headers.update(disp) cache_control = CACHE_CONTROL.tuples( public=True, max_age=request.registry.package_max_age) request.response.headers.update(cache_control) request.response.body = data request.response.content_type = "application/octet-stream" return request.response if request.registry.stream_files: with request.db.storage.open(package) as data: request.response.body = data.read() disp = CONTENT_DISPOSITION.tuples(filename=package.filename) request.response.headers.update(disp) cache = CACHE_CONTROL.tuples(public=True, max_age=request.registry.package_max_age) request.response.headers.update(cache) request.response.content_type = "application/octect-stream" return request.response response = request.db.download_response(package) return response