Skip to content

Commit c2487a2

Browse files
authored
feat(routing/http/client): DefaultProtocolFilter for IPIP-484 (#689)
1 parent 08fb71d commit c2487a2

File tree

4 files changed

+64
-21
lines changed

4 files changed

+64
-21
lines changed

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@ The following emojis are used to highlight certain changes:
1818

1919
### Changed
2020

21+
- `routing/http/client`: creating delegated routing client with `New` now defaults to querying delegated routing server with `DefaultProtocolFilter` ([IPIP-484](https://github.com/ipfs/specs/pull/484)) [#689](https://github.com/ipfs/boxo/pull/689)
22+
2123
### Removed
2224

2325
### Fixed

examples/routing/delegated-routing-client/main_test.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,15 +25,16 @@ func TestFindProviders(t *testing.T) {
2525
if r.URL.Path == "/routing/v1/providers/"+cidStr {
2626
w.Header().Set("Content-Type", "application/x-ndjson")
2727
w.Write([]byte(`{"Schema":"peer","ID":"12D3KooWM8sovaEGU1bmiWGWAzvs47DEcXKZZTuJnpQyVTkRs2Vn","Addrs":["/ip4/111.222.222.111/tcp/5734"],"Protocols":["transport-bitswap"]}` + "\n"))
28-
w.Write([]byte(`{"Schema":"peer","ID":"12D3KooWB6RAWgcmHAP7TGEGK7utV2ZuqSzX1DNjRa97TtJ7139n","Addrs":["/ip4/127.0.0.1/tcp/5734"],"Protocols":["transport-horse"]}` + "\n"))
28+
w.Write([]byte(`{"Schema":"peer","ID":"12D3KooWS6BmwfQEZcRqCHCBbDL2DF5a6F7dZnbPFkwmZCuLEK5f","Addrs":["/ip4/127.0.0.1/tcp/6434"],"Protocols":["horse"]}` + "\n")) // this one will be skipped by DefaultProtocolFilter
29+
w.Write([]byte(`{"Schema":"peer","ID":"12D3KooWB6RAWgcmHAP7TGEGK7utV2ZuqSzX1DNjRa97TtJ7139n","Addrs":["/ip4/127.0.0.1/tcp/5734"],"Protocols":[]}` + "\n"))
2930
}
3031
}))
3132
t.Cleanup(ts.Close)
3233

3334
out := &bytes.Buffer{}
3435
err := run(out, ts.URL, cidStr, "", "", 1)
3536
assert.Contains(t, out.String(), "12D3KooWM8sovaEGU1bmiWGWAzvs47DEcXKZZTuJnpQyVTkRs2Vn\n\tProtocols: [transport-bitswap]\n\tAddresses: [/ip4/111.222.222.111/tcp/5734]\n")
36-
assert.Contains(t, out.String(), "12D3KooWB6RAWgcmHAP7TGEGK7utV2ZuqSzX1DNjRa97TtJ7139n\n\tProtocols: [transport-horse]\n\tAddresses: [/ip4/127.0.0.1/tcp/5734]\n")
37+
assert.Contains(t, out.String(), "12D3KooWB6RAWgcmHAP7TGEGK7utV2ZuqSzX1DNjRa97TtJ7139n\n\tProtocols: []\n\tAddresses: [/ip4/127.0.0.1/tcp/5734]\n")
3738
assert.NoError(t, err)
3839
}
3940

routing/http/client/client.go

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@ import (
3333
var (
3434
_ contentrouter.Client = &Client{}
3535
logger = logging.Logger("routing/http/client")
36+
37+
DefaultProtocolFilter = []string{"unknown", "transport-bitswap"} // IPIP-484
3638
)
3739

3840
const (
@@ -175,10 +177,11 @@ func WithStreamResultsRequired() Option {
175177
// The Provider and identity parameters are option. If they are nil, the [client.ProvideBitswap] method will not function.
176178
func New(baseURL string, opts ...Option) (*Client, error) {
177179
client := &Client{
178-
baseURL: baseURL,
179-
httpClient: newDefaultHTTPClient(defaultUserAgent),
180-
clock: clock.New(),
181-
accepts: strings.Join([]string{mediaTypeNDJSON, mediaTypeJSON}, ","),
180+
baseURL: baseURL,
181+
httpClient: newDefaultHTTPClient(defaultUserAgent),
182+
clock: clock.New(),
183+
accepts: strings.Join([]string{mediaTypeNDJSON, mediaTypeJSON}, ","),
184+
protocolFilter: DefaultProtocolFilter, // can be customized via WithProtocolFilter
182185
}
183186

184187
for _, opt := range opts {

routing/http/client/client_test.go

Lines changed: 52 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -223,11 +223,22 @@ func (e *osErrContains) errContains(t *testing.T, err error) {
223223
}
224224

225225
func TestClient_FindProviders(t *testing.T) {
226+
unknownPeerRecord := makePeerRecord([]string{})
226227
bitswapPeerRecord := makePeerRecord([]string{"transport-bitswap"})
227228
httpPeerRecord := makePeerRecord([]string{"transport-ipfs-gateway-http"})
229+
fooPeerRecord := makePeerRecord([]string{"transport-foo"})
230+
228231
peerProviders := []iter.Result[types.Record]{
232+
{Val: &unknownPeerRecord},
229233
{Val: &bitswapPeerRecord},
230234
{Val: &httpPeerRecord},
235+
{Val: &fooPeerRecord},
236+
}
237+
238+
// DefaultProtocolFilter
239+
defaultFilterPeerProviders := []iter.Result[types.Record]{
240+
{Val: &unknownPeerRecord},
241+
{Val: &bitswapPeerRecord},
231242
}
232243

233244
bitswapRecord := makeBitswapRecord()
@@ -249,16 +260,23 @@ func TestClient_FindProviders(t *testing.T) {
249260
expJSONResponse bool
250261
}{
251262
{
252-
name: "happy case",
263+
name: "happy case with DefaultProtocolFilter",
264+
routerResult: peerProviders,
265+
expResult: defaultFilterPeerProviders,
266+
expStreamingResponse: true,
267+
},
268+
{
269+
name: "pass through with protocol filter disabled",
270+
filterProtocols: []string{},
253271
routerResult: peerProviders,
254272
expResult: peerProviders,
255273
expStreamingResponse: true,
256274
},
257275
{
258-
name: "happy case with protocol filter",
259-
filterProtocols: []string{"transport-bitswap"},
276+
name: "happy case with custom protocol filter",
277+
filterProtocols: []string{"transport-foo"},
260278
routerResult: peerProviders,
261-
expResult: []iter.Result[types.Record]{{Val: &bitswapPeerRecord}},
279+
expResult: []iter.Result[types.Record]{{Val: &fooPeerRecord}},
262280
expStreamingResponse: true,
263281
},
264282
{
@@ -270,7 +288,7 @@ func TestClient_FindProviders(t *testing.T) {
270288
{
271289
name: "server doesn't support streaming",
272290
routerResult: peerProviders,
273-
expResult: peerProviders,
291+
expResult: defaultFilterPeerProviders,
274292
serverStreamingDisabled: true,
275293
expJSONResponse: true,
276294
},
@@ -497,13 +515,25 @@ func TestClient_Provide(t *testing.T) {
497515
}
498516

499517
func TestClient_FindPeers(t *testing.T) {
500-
peerRecord1 := makePeerRecord([]string{"transport-bitswap"})
501-
peerRecord2 := makePeerRecord([]string{"transport-ipfs-gateway-http"})
518+
unknownPeerRecord := makePeerRecord([]string{})
519+
bitswapPeerRecord := makePeerRecord([]string{"transport-bitswap"})
520+
httpPeerRecord := makePeerRecord([]string{"transport-ipfs-gateway-http"})
521+
fooPeerRecord := makePeerRecord([]string{"transport-foo"})
522+
502523
peerRecords := []iter.Result[*types.PeerRecord]{
503-
{Val: &peerRecord1},
504-
{Val: &peerRecord2},
524+
{Val: &unknownPeerRecord},
525+
{Val: &bitswapPeerRecord},
526+
{Val: &httpPeerRecord},
527+
{Val: &fooPeerRecord},
528+
}
529+
530+
// DefaultProtocolFilter
531+
defaultFilterPeerRecords := []iter.Result[*types.PeerRecord]{
532+
{Val: &unknownPeerRecord},
533+
{Val: &bitswapPeerRecord},
505534
}
506-
pid := *peerRecord1.ID
535+
536+
pid := *bitswapPeerRecord.ID
507537

508538
cases := []struct {
509539
name string
@@ -521,22 +551,29 @@ func TestClient_FindPeers(t *testing.T) {
521551
expJSONResponse bool
522552
}{
523553
{
524-
name: "happy case",
554+
name: "happy case with DefaultProtocolFilter",
555+
routerResult: peerRecords,
556+
expResult: defaultFilterPeerRecords,
557+
expStreamingResponse: true,
558+
},
559+
{
560+
name: "pass through with protocol filter disabled",
561+
filterProtocols: []string{},
525562
routerResult: peerRecords,
526563
expResult: peerRecords,
527564
expStreamingResponse: true,
528565
},
529566
{
530-
name: "happy case with protocol filter",
531-
filterProtocols: []string{"transport-bitswap"},
567+
name: "happy case with custom protocol filter",
568+
filterProtocols: []string{"transport-foo"},
532569
routerResult: peerRecords,
533-
expResult: []iter.Result[*types.PeerRecord]{{Val: &peerRecord1}},
570+
expResult: []iter.Result[*types.PeerRecord]{{Val: &fooPeerRecord}},
534571
expStreamingResponse: true,
535572
},
536573
{
537574
name: "server doesn't support streaming",
538575
routerResult: peerRecords,
539-
expResult: peerRecords,
576+
expResult: defaultFilterPeerRecords,
540577
serverStreamingDisabled: true,
541578
expJSONResponse: true,
542579
},

0 commit comments

Comments
 (0)