Skip to content

Commit b9958d0

Browse files
committed
feat: proto & addr filter in peer routing endpoint
1 parent 3a6de23 commit b9958d0

File tree

2 files changed

+33
-7
lines changed

2 files changed

+33
-7
lines changed

routing/http/server/server.go

Lines changed: 32 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -284,14 +284,18 @@ func (s *server) findPeers(w http.ResponseWriter, r *http.Request) {
284284
return
285285
}
286286

287+
query := r.URL.Query()
288+
filterAddrs := parseFilter(query.Get("filter-addrs"))
289+
filterProtocols := parseFilter(query.Get("filter-protocols"))
290+
287291
mediaType, err := s.detectResponseType(r)
288292
if err != nil {
289293
writeErr(w, "FindPeers", http.StatusBadRequest, err)
290294
return
291295
}
292296

293297
var (
294-
handlerFunc func(w http.ResponseWriter, provIter iter.ResultIter[*types.PeerRecord])
298+
handlerFunc func(w http.ResponseWriter, provIter iter.ResultIter[*types.PeerRecord], filterAddrs, filterProtocols []string)
295299
recordsLimit int
296300
)
297301

@@ -314,7 +318,7 @@ func (s *server) findPeers(w http.ResponseWriter, r *http.Request) {
314318
}
315319
}
316320

317-
handlerFunc(w, provIter)
321+
handlerFunc(w, provIter, filterAddrs, filterProtocols)
318322
}
319323

320324
func (s *server) provide(w http.ResponseWriter, httpReq *http.Request) {
@@ -376,10 +380,21 @@ func (s *server) provide(w http.ResponseWriter, httpReq *http.Request) {
376380
writeJSONResult(w, "Provide", resp)
377381
}
378382

379-
func (s *server) findPeersJSON(w http.ResponseWriter, peersIter iter.ResultIter[*types.PeerRecord]) {
383+
func (s *server) findPeersJSON(w http.ResponseWriter, peersIter iter.ResultIter[*types.PeerRecord], filterAddrs, filterProtocols []string) {
380384
defer peersIter.Close()
381385

382-
peers, err := iter.ReadAllResults(peersIter)
386+
// Convert PeerRecord to Record so that we can reuse the filtering logic from findProviders
387+
mappedIter := iter.Map(peersIter, func(v iter.Result[*types.PeerRecord]) iter.Result[types.Record] {
388+
if v.Err != nil || v.Val == nil {
389+
return iter.Result[types.Record]{Err: v.Err}
390+
}
391+
392+
var record types.Record = v.Val
393+
return iter.Result[types.Record]{Val: record}
394+
})
395+
396+
filteredIter := applyFiltersToIter(mappedIter, filterAddrs, filterProtocols)
397+
peers, err := iter.ReadAllResults(filteredIter)
383398
if err != nil {
384399
writeErr(w, "FindPeers", http.StatusInternalServerError, fmt.Errorf("delegate error: %w", err))
385400
return
@@ -390,8 +405,19 @@ func (s *server) findPeersJSON(w http.ResponseWriter, peersIter iter.ResultIter[
390405
})
391406
}
392407

393-
func (s *server) findPeersNDJSON(w http.ResponseWriter, peersIter iter.ResultIter[*types.PeerRecord]) {
394-
writeResultsIterNDJSON(w, peersIter)
408+
func (s *server) findPeersNDJSON(w http.ResponseWriter, peersIter iter.ResultIter[*types.PeerRecord], filterAddrs, filterProtocols []string) {
409+
// Convert PeerRecord to Record so that we can reuse the filtering logic from findProviders
410+
mappedIter := iter.Map(peersIter, func(v iter.Result[*types.PeerRecord]) iter.Result[types.Record] {
411+
if v.Err != nil || v.Val == nil {
412+
return iter.Result[types.Record]{Err: v.Err}
413+
}
414+
415+
var record types.Record = v.Val
416+
return iter.Result[types.Record]{Val: record}
417+
})
418+
419+
filteredIter := applyFiltersToIter(mappedIter, filterAddrs, filterProtocols)
420+
writeResultsIterNDJSON(w, filteredIter)
395421
}
396422

397423
func (s *server) GetIPNS(w http.ResponseWriter, r *http.Request) {

routing/http/types/json/responses.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ func (r ProvidersResponse) Length() int {
1717

1818
// PeersResponse is the result of a GET Peers request.
1919
type PeersResponse struct {
20-
Peers []*types.PeerRecord
20+
Peers []types.Record
2121
}
2222

2323
func (r PeersResponse) Length() int {

0 commit comments

Comments
 (0)