fsspec / ipfsspec

readonly python fsspec implementation for IPFS
MIT License
21 stars 10 forks source link

requests to IPNS URLs may fail #41

Open d70-t opened 1 week ago

d70-t commented 1 week ago

As noticed in #39, some gateways don't support requesting format=raw for URLs including a path.

Aparrently, trustless-gateway.link also doesn't support format=car for IPNS links (and according to the spec, only format=ipns-record has to be supported). For this reason, ls and info may fail for IPNS links in similar ways as outlined for #39.

E.g.:

This fails:

IPFS_GATEWAY='https://ipfs.io' python3 -c "import fsspec; fs, _ = fsspec.url_to_fs('ipns://ipfs.io'); print(fs.ls('ipfs.io'))"
...
aiohttp.client_exceptions.ClientResponseError: 406, message='Not Acceptable', url='https://trustless-gateway.link/ipns/ipfs.io?format=car&dag-scope=block'

while the following succeeds (assuming a local kubo instance running):

IPFS_GATEWAY='http://127.0.0.1:8080' python3 -c "import fsspec; fs, _ = fsspec.url_to_fs('ipns://ipfs.io'); print(fs.ls('ipfs.io'))"
d70-t commented 1 week ago

It should be possible to circumvent this issue by resolving IPNS names to a CID before doing subsequent requests. However, a question remains, how to do this. IPNS names can be

One option might be to issue a HEAD request to the /ipns/ API endpoint and inspect the X-Ipfs-Roots response header, which should include the CID for a given name. It's however unclear how to handle name changes and timeouts (e.g. the TTL value from the DNS entry).