|
10 | 10 | from packaging.utils import InvalidWheelFilename |
11 | 11 | from packaging.version import InvalidVersion, Version |
12 | 12 |
|
13 | | -from ._compat import fetch_string_and_headers |
| 13 | +from ._compat import HttpStatusError, fetch_string_and_headers |
14 | 14 | from ._utils import is_package_compatible, parse_version |
15 | 15 | from .externals.mousebender.simple import from_project_details_html |
16 | 16 | from .wheelinfo import WheelInfo |
@@ -276,11 +276,33 @@ async def query_package( |
276 | 276 |
|
277 | 277 | try: |
278 | 278 | metadata, headers = await fetch_string_and_headers(url, _fetch_kwargs) |
| 279 | + except HttpStatusError as e: |
| 280 | + if e.status_code == 404: |
| 281 | + continue |
| 282 | + raise |
279 | 283 | except OSError: |
280 | | - continue |
| 284 | + # temporary pyodide compatibility. |
| 285 | + # pypi now set proper CORS on 404 (https://github.com/pypi/warehouse/pull/16339), |
| 286 | + # but stable pyodide (<0.27) does not yet have proper HttpStatusError exception |
| 287 | + # so when: on pyodide and 0.26.x we ignore OSError. Once we drop support for 0.26 |
| 288 | + # all this OSError except clause should just be gone. |
| 289 | + try: |
| 290 | + import pyodide |
| 291 | + from packaging.version import parse |
| 292 | + |
| 293 | + if parse(pyodide.__version__) > parse("0.27"): |
| 294 | + # reraise on more recent pyodide. |
| 295 | + raise |
| 296 | + continue |
| 297 | + except ImportError: |
| 298 | + # not in pyodide. |
| 299 | + raise |
281 | 300 |
|
282 | 301 | content_type = headers.get("content-type", "").lower() |
283 | | - parser = _select_parser(content_type, name) |
| 302 | + try: |
| 303 | + parser = _select_parser(content_type, name) |
| 304 | + except ValueError as e: |
| 305 | + raise ValueError(f"Error trying to decode url: {url}") from e |
284 | 306 | return parser(metadata) |
285 | 307 | else: |
286 | 308 | raise ValueError( |
|
0 commit comments