From 75584db7a6b4c23f95d11d7908aea790c635151a Mon Sep 17 00:00:00 2001 From: Marco Munizaga Date: Fri, 21 Jun 2024 15:23:40 -0700 Subject: [PATCH 1/2] Fail if a peer ID is provided with an http transport --- src/whatwg-fetch-service.ts | 14 +++++++++++++- test/index.spec.ts | 7 +++++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/src/whatwg-fetch-service.ts b/src/whatwg-fetch-service.ts index bfc75e4..6dc4163 100644 --- a/src/whatwg-fetch-service.ts +++ b/src/whatwg-fetch-service.ts @@ -123,6 +123,9 @@ export class WHATWGFetch implements Startable, WHATWGFetchInterface { const peerWithoutHTTPPath = ma.decapsulateCode(protocols('http-path').code) if (this.isHTTPTransportMultiaddr(peerWithoutHTTPPath)) { + if (peerWithoutHTTPPath.getPeerId() !== null) { + throw new Error('HTTP Transport does not yet support peer IDs. Use a stream based transport instead.') + } const [, httpPathVal] = ma.stringTuples().find(([code]) => code === protocols('http-path').code ) ?? ['', ''] @@ -166,7 +169,13 @@ export class WHATWGFetch implements Startable, WHATWGFetchInterface { throw new Error('peer multiaddr must have at least one part') } - return parts[parts.length - 1].name === 'http' || parts[parts.length - 1].name === 'https' + // Reverse order for faster common case (/http is near the end) + for (let i = parts.length - 1; i >= 0; i--) { + if (parts[i].name === 'http' || parts[i].name === 'https') { + return true + } + } + return false } // Register a protocol with a path and remember it so we can tell our peers @@ -212,6 +221,9 @@ export class WHATWGFetch implements Startable, WHATWGFetchInterface { let fetch let reqUrl = '' if (this.isHTTPTransportMultiaddr(peerAddr)) { + if (peerAddr.getPeerId() !== null) { + throw new Error('HTTP Transport does not yet support peer IDs. Use a stream based transport instead.') + } fetch = this._fetch reqUrl = `${multiaddrToUri(peerAddr)}${WELL_KNOWN_PROTOCOLS}` } else { diff --git a/test/index.spec.ts b/test/index.spec.ts index fd9b71a..11027a8 100644 --- a/test/index.spec.ts +++ b/test/index.spec.ts @@ -5,6 +5,7 @@ import { streamPair } from '@libp2p/interface-compliance-tests/mocks' import { defaultLogger } from '@libp2p/logger' import { peerIdFromString } from '@libp2p/peer-id' import { multiaddr, type Multiaddr, type Protocol } from '@multiformats/multiaddr' +import { expect } from 'aegir/chai' import { duplexPair } from 'it-pair/duplex' import { type Libp2p } from 'libp2p' import pDefer from 'p-defer' @@ -95,4 +96,10 @@ describe('whatwg-fetch', () => { await ping.sendPing(clientNode, serverPeerID) }) + + it('Throws an error if using an http transport with a peer id component', async () => { + const clientNode = stubInterface>({ services: { http: client } }) + + await expect(ping.sendPing(clientNode, multiaddr('/ip4/127.0.0.1/http/p2p/' + serverPeerID.toString()))).to.be.rejectedWith('HTTP Transport does not yet support peer IDs') + }) }) From 5c6a7a68e8dc6a19be09c0c907a2c4a583e61691 Mon Sep 17 00:00:00 2001 From: Marco Munizaga Date: Fri, 21 Jun 2024 15:31:52 -0700 Subject: [PATCH 2/2] Cleanup duplicated code --- src/whatwg-fetch-service.ts | 17 ++--------------- 1 file changed, 2 insertions(+), 15 deletions(-) diff --git a/src/whatwg-fetch-service.ts b/src/whatwg-fetch-service.ts index 6dc4163..6d7030c 100644 --- a/src/whatwg-fetch-service.ts +++ b/src/whatwg-fetch-service.ts @@ -218,21 +218,8 @@ export class WHATWGFetch implements Startable, WHATWGFetchInterface { return cached } - let fetch - let reqUrl = '' - if (this.isHTTPTransportMultiaddr(peerAddr)) { - if (peerAddr.getPeerId() !== null) { - throw new Error('HTTP Transport does not yet support peer IDs. Use a stream based transport instead.') - } - fetch = this._fetch - reqUrl = `${multiaddrToUri(peerAddr)}${WELL_KNOWN_PROTOCOLS}` - } else { - const conn = await this.components.connectionManager.openConnection(peerAddr) - const s = await conn.newStream(PROTOCOL_NAME) - fetch = fetchViaDuplex(s) - reqUrl = multiaddrURIPrefix + peerAddr.encapsulate(`/http-path/${encodeURIComponent(WELL_KNOWN_PROTOCOLS)}`).toString() - } - const resp = await fetch(new Request(reqUrl, { + const reqUrl = multiaddrURIPrefix + peerAddr.encapsulate(`/http-path/${encodeURIComponent(WELL_KNOWN_PROTOCOLS)}`).toString() + const resp = await this.fetch(new Request(reqUrl, { method: 'GET', headers: { Accept: 'application/json'