def package_versions(context, request): """ Render the links for all versions of a package """ normalized_name = normalize_name(context.name) # filename -> url pkgs = {} # packages in database packages = request.db.all(normalized_name) if packages and request.access.has_permission(normalized_name, 'read'): for package in packages: pkgs[package.filename] = package.get_url(request) # packages in fallback if request.registry.fallback == 'cache' and request.access.can_update_cache(): locator = FilenameScrapingLocator(request.registry.fallback_url) dists = locator.get_project(context.name) for dist in six.itervalues(dists): filename = posixpath.basename(dist.source_url) url = request.app_url('api', 'package', dist.name, filename) if filename not in pkgs: pkgs[filename] = url # just redirect if len(pkgs) == 0: if request.registry.fallback == 'redirect': redirect_url = "%s/%s/" % ( request.registry.fallback_url.rstrip('/'), context.name) return HTTPFound(location=redirect_url) else: return HTTPNotFound() else: return {"pkgs": pkgs}
def package_versions(context, request): """ Render the links for all versions of a package """ normalized_name = normalize_name(context.name) packages = request.db.all(normalized_name) if packages: if not request.access.has_permission(normalized_name, 'read'): return request.forbid() pkgs = {} for package in packages: pkgs[package.filename] = package.get_url(request) return {'pkgs': pkgs} elif request.registry.fallback == 'cache': if not request.access.can_update_cache(): return request.forbid() locator = FilenameScrapingLocator(request.registry.fallback_url) dists = locator.get_project(context.name) if not dists: return HTTPNotFound() pkgs = {} for dist in six.itervalues(dists): filename = posixpath.basename(dist.source_url) url = request.app_url('api', 'package', dist.name, filename) pkgs[filename] = url return {'pkgs': pkgs} elif request.registry.fallback == 'redirect': redirect_url = "%s/%s/" % ( request.registry.fallback_url.rstrip('/'), context.name) return HTTPFound(location=redirect_url) else: return HTTPNotFound()
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 locator = FilenameScrapingLocator(request.registry.fallback_url) dists = locator.get_project(context.name) dist = dists.get(context.filename) if dist is None: return HTTPNotFound() LOG.info("Caching %s from %s", context.filename, request.registry.fallback_url) package = fetch_dist(request, dist) return request.db.download_response(package)
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 locator = FilenameScrapingLocator(request.registry.fallback_url) dists = locator.get_project(context.name) dist = dists.get(context.filename) if dist is None: return HTTPNotFound() LOG.info("Caching %s from %s", context.filename, request.registry.fallback_url) package, data = fetch_dist(request, dist) disp = CONTENT_DISPOSITION.tuples(filename=package.filename) request.response.headers.update(disp) request.response.body = data 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 locator = FilenameScrapingLocator(request.registry.fallback_url) dists = locator.get_project(context.name) dist = dists.get(context.filename) if dist is None: return HTTPNotFound() LOG.info("Caching %s from %s", context.filename, request.registry.fallback_url) package = fetch_dist(request, dist) # S3 will take a while to catch up (eventual consistency and all that). # In the meantime, just give up the link to where you got the original # package. return HTTPFound(location=dist.source_url) else: return request.db.download_response(package)