@@ -101,6 +101,28 @@ public Map resolve(String scheme, String path, boolean recursive) {
101101 return ret .get ();
102102 }
103103
104+ /**
105+ * As defined in https://github.com/libp2p/go-libp2p-core/blob/b77fd280f2bfcce22f10a000e8e1d9ec53c47049/routing/query.go#L16
106+ */
107+ public enum DHTQueryEventType {
108+ // Sending a query to a peer.
109+ SendingQuery ,
110+ // Got a response from a peer.
111+ PeerResponse ,
112+ // Found a "closest" peer (not currently used).
113+ FinalPeer ,
114+ // Got an error when querying.
115+ QueryError ,
116+ // Found a provider.
117+ Provider ,
118+ // Found a value.
119+ Value ,
120+ // Adding a peer to the query.
121+ AddingPeer ,
122+ // Dialing a peer.
123+ DialingPeer ;
124+ }
125+
104126 public class DHT {
105127 /**
106128 * Find internet addresses of a given peer.
@@ -117,17 +139,25 @@ public List<String> findpeerListTimeout(Multihash id, int timeout, ExecutorServi
117139 timeout ,
118140 res -> {
119141 Map peer = (Map ) res ;
120- if (peer != null ) {
121- if ( (int ) peer .get ("Type" ) == 2 ) {
122- ret .set ((List <String >)
123- ((Map )
124- ((List ) peer .get ("Responses" )
125- ).get (0 )
126- ).get ("Addrs" ));
127- return true ;
128- }
142+ if (peer == null ) {
143+ return false ;
144+ }
145+ if ( (int ) peer .get ("Type" ) != DHTQueryEventType .FinalPeer .ordinal () ) {
146+ return false ;
147+ }
148+ List <Map > responses = (List <Map >) peer .get ("Responses" );
149+ if (responses == null || responses .size () == 0 ) {
150+ return false ;
151+ }
152+ // FinalPeer responses have exactly one response
153+ Map <String , List <String >> response = responses .get (0 );
154+ if (response == null ) {
155+ return false ;
129156 }
130- return false ;
157+ List <String > addrs = response .get ("Addrs" );
158+
159+ ret .set (addrs );
160+ return true ;
131161 },
132162 err -> {
133163 if (!(err instanceof TimeoutException )) {
@@ -158,17 +188,24 @@ public List<String> findprovsListTimeout(Multihash id, int maxPeers, int timeout
158188 timeout ,
159189 res -> {
160190 Map peer = (Map ) res ;
161- if ( peer != null ) {
162- if ( (int ) peer .get ("Type" ) == 4 ) {
163- ret .get ().add (
164- (String )
165- ((Map )
166- ((List ) peer .get ("Responses" )
167- ).get (0 )
168- ).get ("ID" )
169- );
170- }
191+ if ( peer == null ) {
192+ return false ;
193+ }
194+ if ( (int ) peer .get ("Type" ) != DHTQueryEventType .Provider .ordinal () ) {
195+ return false ;
171196 }
197+ List <Map > responses = (List <Map >) peer .get ("Responses" );
198+ if (responses == null || responses .size () == 0 ) {
199+ return false ;
200+ }
201+ // One Provider message contains only one provider
202+ Map <String , String > response = responses .get (0 );
203+ if (response == null ) {
204+ return false ;
205+ }
206+ String providerID = response .get ("ID" );
207+
208+ ret .get ().add (providerID );
172209 return ret .get ().size () >= maxPeers ;
173210 },
174211 err -> {
0 commit comments