📄 trtrackerservertorrentimpl.java
字号:
}
List biased_peers = (List)reply.get("biased_peers");
if (biased_peers != null)
{
if (explicit_biased_peers == null)
explicit_biased_peers = new ArrayList();
for (int j = 0; j < biased_peers.size(); j++)
{
Map peer_map = (Map)biased_peers.get(j);
String ip = (String)peer_map.get("ip");
int port = ((Long)peer_map.get("port")).intValue();
String reuse_key = (new StringBuilder()).append(ip).append(":").append(port).toString();
TRTrackerServerSimplePeer peer = (TRTrackerServerSimplePeer)peer_reuse_map.get(reuse_key);
if (peer == null)
peer = new temporaryBiasedSeed(ip, port);
if (!explicit_biased_peers.contains(peer))
explicit_biased_peers.add(peer);
}
}
remove_ips = (Set)reply.get("remove_ips");
}
catch (Throwable e)
{
Debug.printStackTrace(e);
}
}
if (requesting_peer == null)
{
Set bp = server.getBiasedPeers();
if (bp == null)
requester_is_biased = false;
else
requester_is_biased = bp.contains(ip_address);
} else
{
requester_is_biased = requesting_peer.isBiased();
}
if (!caching_enabled || explicit_limited_peers != null || explicit_biased_peers != null || requester_is_biased || remove_ips != null || nat_warning || preprocess_map.size() != 0 || cache_millis <= 0 || num_want < 10 || total_peers < TRTrackerServerImpl.getAnnounceCachePeerThreshold() || crypto_level == 2)
break MISSING_BLOCK_LABEL_858;
network_position = null;
Iterator it = announce_cache.keySet().iterator();
do
{
if (!it.hasNext())
break;
Integer key = (Integer)it.next();
announceCacheEntry entry = (announceCacheEntry)announce_cache.get(key);
if (now - entry.getTime() > (long)cache_millis)
it.remove();
} while (true);
i = num_want / 10;
_L1:
Map rep_peer;
if (i <= num_want / 20)
break MISSING_BLOCK_LABEL_855;
announceCacheEntry entry = (announceCacheEntry)announce_cache.get(new Integer(i));
if (entry == null)
break MISSING_BLOCK_LABEL_849;
if (now - entry.getTime() > (long)cache_millis)
{
announce_cache.remove(new Integer(i));
break MISSING_BLOCK_LABEL_849;
}
if (entry.getSendPeerIds() != send_peer_ids || entry.getCompactMode() != compact_mode)
break MISSING_BLOCK_LABEL_849;
rep_peer = entry.getData();
this_mon.exit();
return rep_peer;
i--;
goto _L1
add_to_cache = true;
LinkedList rep_peers = new LinkedList();
if (num_want <= 0 || explicit_limited_peers != null) goto _L3; else goto _L2
_L2:
if (num_want < total_peers) goto _L5; else goto _L4
_L4:
i = 0;
_L15:
TRTrackerServerPeerImpl peer;
if (i >= peer_list.size())
break; /* Loop/switch isn't completed */
peer = (TRTrackerServerPeerImpl)peer_list.get(i);
if (peer != null && peer != requesting_peer) goto _L7; else goto _L6
_L7:
if (now <= peer.getTimeout()) goto _L9; else goto _L8
_L8:
removePeer(peer, i, 5, null);
goto _L6
_L9:
if (peer.getTCPPort() == 0 || crypto_level == 0 && peer.getCryptoLevel() == 2 || remove_ips != null && remove_ips.contains(new String(peer.getIP())) || !include_seeds && peer.isSeed()) goto _L6; else goto _L10
_L10:
rep_peer = new HashMap(3);
if (send_peer_ids)
rep_peer.put("peer id", peer.getPeerId().getHash());
if (compact_mode == 0) goto _L12; else goto _L11
_L11:
byte peer_bytes[] = peer.getIPAddressBytes();
if (peer_bytes != null) goto _L13; else goto _L6
_L13:
rep_peer.put("ip", peer_bytes);
if (compact_mode >= 2)
{
rep_peer.put("azver", new Long(peer.getAZVer()));
rep_peer.put("azudp", new Long(peer.getUDPPort()));
if (peer.isSeed())
rep_peer.put("azhttp", new Long(peer.getHTTPPort()));
if (compact_mode >= 16)
{
rep_peer.put("ip", peer.getIPAsRead());
} else
{
rep_peer.put("azup", new Long(peer.getUpSpeed()));
if (peer.isBiased())
rep_peer.put("azbiased", "");
if (network_position != null)
{
DHTNetworkPosition peer_pos = peer.getNetworkPosition();
if (peer_pos != null && network_position.getPositionType() == peer_pos.getPositionType())
rep_peer.put("azrtt", new Long((long)peer_pos.estimateRTT(network_position)));
}
}
}
goto _L14
_L12:
rep_peer.put("ip", peer.getIPAsRead());
_L14:
rep_peer.put("port", new Long(peer.getTCPPort()));
if (crypto_level != 0)
rep_peer.put("crypto_flag", new Long(peer.getCryptoLevel() != 2 ? 0L : 1L));
if (peer.isBiased())
rep_peers.addFirst(rep_peer);
else
rep_peers.addLast(rep_peer);
_L6:
i++;
if (true) goto _L15; else goto _L3
_L5:
int peer_list_size;
boolean peer_removed;
peer_list_size = peer_list.size();
if (duplicate_peer_checker.length < peer_list_size)
{
duplicate_peer_checker = new byte[peer_list_size * 2];
duplicate_peer_checker_index = 1;
} else
if (duplicate_peer_checker.length > peer_list_size * 2)
{
duplicate_peer_checker = new byte[(3 * peer_list_size) / 2];
duplicate_peer_checker_index = 1;
} else
{
duplicate_peer_checker_index++;
if (duplicate_peer_checker_index == 0)
{
Arrays.fill(duplicate_peer_checker, (byte)0);
duplicate_peer_checker_index = 1;
}
}
peer_removed = false;
peer_list_compaction_suspended = true;
int added = 0;
for (int bad_nat_loop = TRTrackerServerNATChecker.getSingleton().isEnabled() ? 0 : 1; bad_nat_loop < 2; bad_nat_loop++)
{
int limit = num_want * 2;
if (num_want * 3 > total_peers)
limit++;
int biased_peers_count = 0;
if (this.biased_peers != null)
{
if (this.biased_peers.size() > 1)
{
Object x = this.biased_peers.remove(0);
this.biased_peers.add(random.nextInt(this.biased_peers.size() + 1), x);
}
biased_peers_count = Math.min(min_biased_peers, this.biased_peers.size());
}
for (int i = 0; i < limit && added < num_want; i++)
{
int peer_index;
TRTrackerServerPeerImpl peer;
if (bad_nat_loop == 1 && i < biased_peers_count)
{
peer = (TRTrackerServerPeerImpl)this.biased_peers.get(i);
peer_index = -1;
} else
{
peer_index = random.nextInt(peer_list_size);
peer = (TRTrackerServerPeerImpl)peer_list.get(peer_index);
if (peer == null || peer.isBiased())
continue;
}
if (now > peer.getTimeout())
{
removePeer(peer, 5, null);
peer_removed = true;
continue;
}
if (requesting_peer == peer || peer.getTCPPort() == 0 || crypto_level == 0 && peer.getCryptoLevel() == 2 || remove_ips != null && remove_ips.contains(new String(peer.getIP())) || !include_seeds && peer.isSeed())
continue;
boolean bad_nat = peer.isNATStatusBad();
if ((bad_nat_loop != 0 || bad_nat) && bad_nat_loop != 1 || peer_index != -1 && duplicate_peer_checker[peer_index] == duplicate_peer_checker_index)
continue;
if (peer_index != -1)
duplicate_peer_checker[peer_index] = duplicate_peer_checker_index;
added++;
Map rep_peer = new HashMap(3);
if (send_peer_ids)
rep_peer.put("peer id", peer.getPeerId().getHash());
if (compact_mode != 0)
{
byte peer_bytes[] = peer.getIPAddressBytes();
if (peer_bytes == null)
continue;
rep_peer.put("ip", peer_bytes);
if (compact_mode >= 2)
{
rep_peer.put("azver", new Long(peer.getAZVer()));
rep_peer.put("azudp", new Long(peer.getUDPPort()));
if (peer.isSeed())
rep_peer.put("azhttp", new Long(peer.getHTTPPort()));
if (compact_mode >= 16)
{
rep_peer.put("ip", peer.getIPAsRead());
} else
{
rep_peer.put("azup", new Long(peer.getUpSpeed()));
if (peer.isBiased())
rep_peer.put("azbiased", "");
if (network_position != null)
{
DHTNetworkPosition peer_pos = peer.getNetworkPosition();
if (peer_pos != null && network_position.getPositionType() == peer_pos.getPositionType())
rep_peer.put("azrtt", new Long((long)peer_pos.estimateRTT(network_position)));
}
}
}
} else
{
rep_peer.put("ip", peer.getIPAsRead());
}
rep_peer.put("port", new Long(peer.getTCPPort()));
if (crypto_level != 0)
rep_peer.put("crypto_flag", new Long(peer.getCryptoLevel() != 2 ? 0L : 1L));
if (peer.isBiased())
rep_peers.addFirst(rep_peer);
else
rep_peers.addLast(rep_peer);
}
}
peer_list_compaction_suspended = false;
if (peer_removed)
checkForPeerListCompaction(false);
goto _L3
Exception exception;
exception;
peer_list_compaction_suspended = false;
if (peer_removed)
checkForPeerListCompaction(false);
throw exception;
_L3:
Map map;
if (include_seeds && explicit_limited_peers == null && !send_peer_ids && seed_count < 3 && queued_peers != null)
{
Iterator it = queued_peers.iterator();
List added = new ArrayList(3);
do
{
if (!it.hasNext() || num_want <= rep_peers.size() || added.size() >= 3)
break;
QueuedPeer peer = (QueuedPeer)it.next();
if (peer.isTimedOut(now))
{
it.remove();
continue;
}
if (crypto_level == 0 && peer.getCryptoLevel() == 2 || remove_ips != null && remove_ips.contains(peer.getIP()))
continue;
Map rep_peer = new HashMap(3);
if (compact_mode != 0)
{
byte peer_bytes[] = peer.getIPAddressBytes();
if (peer_bytes == null)
continue;
rep_peer.put("ip", peer_bytes);
if (compact_mode >= 2)
{
rep_peer.put("azver", new Long(peer.getAZVer()));
rep_peer.put("azudp", new Long(peer.getUDPPort()));
if (peer.isSeed())
rep_peer.put("azhttp", new Long(peer.getHTTPPort()));
if (compact_mode >= 16)
rep_peer.put("ip", peer.getIPAsRead());
}
} else
{
rep_peer.put("ip", peer.getIPAsRead());
}
rep_peer.put("port", new Long(peer.getTCPPort()));
if (crypto_level != 0)
rep_peer.put("crypto_flag", new Long(peer.getCryptoLevel() != 2 ? 0L : 1L));
rep_peers.addLast(rep_peer);
added.add(peer);
it.remove();
} while (true);
for (int i = 0; i < added.size(); i++)
queued_peers.add(added.get(i));
}
Map root = new TreeMap();
if (preprocess_map.size() > 0)
root.putAll(preprocess_map);
if (explicit_limited_peers != null)
{
for (int i = 0; i < explicit_limited_peers.size(); i++)
{
num_want--;
TRTrackerServerSimplePeer peer = (TRTrackerServerSimplePeer)explicit_limited_peers.get(i);
exportPeer(rep_peers, peer, send_peer_ids, compact_mode, crypto_level, network_position);
}
}
if (explicit_biased_peers != null)
{
for (int i = 0; i < explicit_biased_peers.size(); i++)
{
num_want--;
TRTrackerServerSimplePeer peer = (TRTrackerServerSimplePeer)explicit_biased_peers.get(i);
exportPeer(rep_peers, peer, send_peer_ids, compact_mode, crypto_level, network_position);
}
}
if (explicit_manual_biased_peers != null && requesting_peer != null && !requesting_peer.isSeed())
{
Object explicit_peer[] = (Object[])(Object[])explicit_manual_biased_peers.get(explicit_next_peer++);
if (explicit_next_peer == explicit_manual_biased_peers.size())
explicit_next_peer = 0;
peer = new HashMap(3);
if (send_peer_ids)
{
byte peer_id[] = new byte[20];
random.nextBytes(peer_id);
peer.put("peer id", peer_id);
}
if (compact_mode != 0)
{
peer_id = (byte[])(byte[])explicit_peer[1];
peer.put("ip", peer_id);
if (compact_mode >= 2)
{
peer.put("azver", new Long(0L));
peer.put("azudp", new Long(0L));
peer.put("azup", new Long(0L));
peer.put("azbiased", "");
}
} else
{
peer.put("ip", ((String)explicit_peer[0]).getBytes());
}
peer.put("port", new Long(((Integer)explicit_peer[2]).intValue()));
if (crypto_level != 0)
peer.put("crypto_flag", new Long(0L));
rep_peers.addFirst(peer);
}
int num_peers_returned = rep_peers.size();
Iterator it = rep_peers.iterator();
if (compact_mode == 2)
{
byte compact_peers[] = new byte[num_peers_returned * 9];
for (int index = 0; it.hasNext(); index++)
{
Map rep_peer = (Map)it.next();
byte ip[] = (byte[])(byte[])rep_peer.get("ip");
int tcp_port = ((Long)rep_peer.get("port")).intValue();
int udp_port = ((Long)rep_peer.get("azudp")).intValue();
Long crypto_flag_l = (Long)rep_peer.get("crypto_flag");
byte crypto_flag = crypto_flag_l != null ? crypto_flag_l.byteValue() : 0;
int pos = index * 9;
System.arraycopy(ip, 0, compact_peers, pos, 4);
pos += 4;
compact_peers[pos++] = (byte)(tcp_port >> 8);
compact_peers[pos++] = (byte)(tcp_port & 0xff);
compact_peers[pos++] = (byte)(udp_port >> 8);
compact_peers[pos++] = (byte)(udp_port & 0xff);
compact_peers[pos++] = crypto_flag;
}
root.put("peers", compact_peers);
root.put("azcompact", new Long(1L));
} else
if (compact_mode == 3)
{
List compact_peers = new ArrayList(num_peers_returned);
do
{
if (!it.hasNext())
break;
Map rep_peer = (Map)it.next();
Map peer = new HashMap();
compact_peers.add(peer);
byte ip[] = (byte[])(byte[])rep_peer.get("ip");
peer.put("i", ip);
int tcp_port = ((Long)rep_peer.get("port")).intValue();
peer.put("t", new byte[] {
(byte)(tcp_port >> 8), (byte)(tcp_port & 0xff)
});
int udp_port = ((Long)rep_peer.get("azudp")).intValue();
if (udp_port != 0)
if (udp_port == tcp_port)
peer.put("u", new byte[0]);
else
peer.put("u", new byte[] {
(byte)(udp_port >> 8), (byte)(udp_port & 0xff)
});
Long http_port_l = (Long)rep_peer.get("azhttp");
if (http_port_l != null)
{
int http_port = http_port_l.intValue();
if (http_port != 0)
peer.put("h", new byte[] {
(byte)(http_port >> 8), (byte)(http_port & 0xff)
});
}
Long crypto_flag_l = (Long)rep_peer.get("crypto_flag");
byte crypto_flag = crypto_flag_l != null ? crypto_flag_l.byteValue() : 0;
if (crypto_flag != 0)
peer.put("c", new byte[] {
crypto_flag
});
Long az_ver_l = (Long)rep_peer.get("azver");
byte az_ver = az_ver_l != null ? az_ver_l.byteValue() : 0;
if (az_ver != 0)
peer.put("v", new Long(az_ver));
Long up_speed = (Long)rep_peer.get("azup");
if (up_speed != null && up_speed.longValue() != 0L)
peer.put("s", up_speed);
Long rtt = (Long)rep_peer.get("azrtt");
if (rtt != null)
peer.put("r", rtt);
if (rep_peer.containsKey("azbiased"))
peer.put("b", new Long(1L));
} while (true);
root.put("peers", compact_peers);
root.put("azcompact", new Long(2L));
} else
if (compact_mode == 16)
{
List xml_peers = new ArrayList(num_peers_returned);
do
{
if (!it.hasNext())
break;
Map rep_peer = (Map)it.next();
Map peer = new HashMap();
xml_peers.add(peer);
peer.put("ip", rep_peer.get("ip"));
peer.put("tcp", rep_peer.get("port"));
int udp_port = ((Long)rep_peer.get("azudp")).intValue();
if (udp_port != 0)
peer.put("udp", new Long(udp_port));
Long http_port_l = (Long)rep_peer.get("azhttp");
if (http_port_l != null)
{
int http_port = http_port_l.intValue();
if (http_port != 0)
peer.put("http", new Long(http_port));
}
} while (true);
root.put("peers", xml_peers);
} else
{
byte crypto_flags[] = null;
if (crypto_level != 0)
crypto_flags = new byte[num_peers_returned];
if (compact_mode == 1)
{
byte compact_peers[] = new byte[num_peers_returned * 6];
int index = 0;
int num_ipv4 = 0;
int num_ipv6 = 0;
while (it.hasNext())
{
Map rep_peer = (Map)it.next();
byte ip[] = (byte[])(byte[])rep_peer.get("ip");
if (ip.length > 4)
{
num_ipv6++;
} else
{
num_ipv4++;
if (num_ipv6 == 0)
{
int port = ((Long)rep_peer.get("port")).intValue();
int pos = index * 6;
System.arraycopy(ip, 0, compact_peers, pos, 4);
pos += 4;
compact_peers[pos++] = (byte)(port >> 8);
compact_peers[pos++] = (byte)(port & 0xff);
}
}
if (crypto_flags != null)
{
Long crypto_flag = (Long)rep_peer.remove("crypto_flag");
crypto_flags[index] = crypto_flag.byteValue();
}
index++;
}
if (num_ipv6 > 0)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -