📄 trtrackerbtannouncerimpl.java
字号:
}
public URL constructUrl(String evt, URL _url)
throws Exception
{
StringBuffer request;
boolean stopped;
String ip;
String tracker_network;
boolean normal_network_ok;
String normal_explicit;
label0:
{
String url = _url.toString();
request = new StringBuffer(url);
if (url.indexOf('?') != -1)
request.append('&');
else
request.append('?');
request.append(info_hash);
request.append(tracker_peer_id_str);
String port_details = announce_data_provider.getCryptoLevel() != 1 ? TRTrackerUtils.getPortsForURL() : TRTrackerUtils.getPortsForURLFullCrypto();
request.append(port_details);
request.append("&uploaded=").append(announce_data_provider.getTotalSent());
request.append("&downloaded=").append(announce_data_provider.getTotalReceived());
request.append("&left=").append(announce_data_provider.getRemaining());
request.append("&corrupt=").append(announce_data_provider.getFailedHashCheck());
if (tracker_id.length() > 0)
request.append("&trackerid=").append(tracker_id);
if (evt.length() != 0)
request.append("&event=").append(evt);
stopped = evt.equals("stopped");
if (stopped)
{
request.append("&numwant=0");
if (stopped_for_queue)
request.append("&azq=1");
} else
{
int numwant = Math.min(calculateNumWant(), userMaxNumwant);
request.append("&numwant=").append(numwant);
}
request.append("&no_peer_id=1");
request.append("&compact=1");
String explicit_ips = COConfigurationManager.getStringParameter("Override Ip", "");
ip = null;
tracker_network = AENetworkClassifier.categoriseAddress(_url.getHost());
boolean network_ok = false;
normal_network_ok = false;
if (peer_networks == null)
{
network_ok = true;
normal_network_ok = true;
} else
{
for (int i = 0; i < peer_networks.length; i++)
{
if (peer_networks[i] == "Public")
normal_network_ok = true;
if (peer_networks[i] == tracker_network)
network_ok = true;
}
}
if (!network_ok)
throw new Exception((new StringBuilder()).append("Network not enabled for url '").append(_url).append("'").toString());
normal_explicit = null;
if (explicit_ips.length() <= 0)
break label0;
StringTokenizer tok = new StringTokenizer(explicit_ips, ";");
String this_address;
String cat;
do
{
do
{
if (!tok.hasMoreTokens())
break label0;
this_address = tok.nextToken().trim();
} while (this_address.length() <= 0);
cat = AENetworkClassifier.categoriseAddress(this_address);
if (cat == "Public")
normal_explicit = this_address;
} while (tracker_network != cat);
ip = this_address;
}
if (ip == null)
if (normal_network_ok && normal_explicit != null)
ip = normal_explicit;
else
if (ip_override != null)
ip = ip_override;
if (ip != null)
{
if (tracker_network == "Public")
try
{
ip = PRHelpers.DNSToIPAddress(ip);
}
catch (UnknownHostException e)
{
if (Logger.isEnabled())
Logger.log(new LogEvent(torrent, LOGID, 3, (new StringBuilder()).append("IP Override host resolution of '").append(ip).append("' fails, using unresolved address").toString()));
}
request.append("&ip=").append(ip);
}
if (COConfigurationManager.getBooleanParameter("Tracker Key Enable Client", true))
request.append("&key=").append(key_id);
String ext = announce_data_provider.getExtensions();
if (ext != null)
{
for (; ext.startsWith("&"); ext = ext.substring(1));
request.append("&");
request.append(ext);
}
request.append("&azver=3");
if (az_tracker && !stopped)
{
int up = announce_data_provider.getUploadSpeedKBSec(evt.equals("started"));
if (up > 0)
request.append((new StringBuilder()).append("&azup=").append(up).toString());
String as = NetworkAdmin.getSingleton().getCurrentASN().getAS();
if (as.length() > 0)
request.append((new StringBuilder()).append("&azas=").append(URLEncoder.encode(as, "UTF8")).toString());
com.aelitis.azureus.core.dht.netcoords.DHTNetworkPosition best_position = DHTNetworkPositionManager.getBestLocalPosition();
if (best_position != null)
try
{
byte bytes[] = DHTNetworkPositionManager.serialisePosition(best_position);
request.append((new StringBuilder()).append("&aznp=").append(Base32.encode(bytes)).toString());
}
catch (Throwable e)
{
Debug.printStackTrace(e);
}
}
return new URL(request.toString());
}
protected int calculateNumWant()
{
if (!announce_data_provider.isPeerSourceEnabled("Tracker"))
return 0;
int MAX_PEERS = 100;
int maxAllowed = announce_data_provider.getMaxNewConnectionsAllowed();
if (maxAllowed < 0 || maxAllowed > MAX_PEERS)
maxAllowed = MAX_PEERS;
return maxAllowed;
}
public byte[] getPeerId()
{
return data_peer_id;
}
public void setAnnounceDataProvider(TRTrackerAnnouncerDataProvider _provider)
{
this_mon.enter();
announce_data_provider = _provider;
this_mon.exit();
break MISSING_BLOCK_LABEL_32;
Exception exception;
exception;
this_mon.exit();
throw exception;
}
public TOTorrent getTorrent()
{
return torrent;
}
public URL getTrackerUrl()
{
return lastUsedUrl;
}
public void setTrackerUrl(URL new_url)
{
try
{
new_url = new URL(new_url.toString().replaceAll(" ", ""));
List list = new ArrayList(1);
list.add(new_url);
trackerUrlLists.clear();
trackerUrlLists.add(list);
informURLChange(lastUsedUrl, new_url, true);
}
catch (Throwable e)
{
Debug.printStackTrace(e);
}
}
public void resetTrackerUrl(boolean shuffle)
{
String old_list = trackerURLListToString();
constructTrackerUrlLists(shuffle);
if (trackerUrlLists.size() == 0)
return;
if (!old_list.equals(trackerURLListToString()))
{
URL first_url = (URL)((List)trackerUrlLists.get(0)).get(0);
informURLChange(lastUsedUrl, first_url, true);
}
}
public void refreshListeners()
{
informURLRefresh();
}
public void setIPOverride(String override)
{
ip_override = override;
}
public void clearIPOverride()
{
ip_override = null;
}
private void constructTrackerUrlLists(boolean shuffle)
{
try
{
trackerUrlLists = new ArrayList(1);
TOTorrentAnnounceURLSet announce_sets[] = torrent.getAnnounceURLGroup().getAnnounceURLSets();
if (announce_sets.length == 0)
{
URL url = torrent.getAnnounceURL();
List list = new ArrayList();
list.add(url);
trackerUrlLists.add(list);
} else
{
for (int i = 0; i < announce_sets.length; i++)
{
URL urls[] = announce_sets[i].getAnnounceURLs();
List random_urls = new ArrayList();
for (int j = 0; j < urls.length; j++)
{
URL url = urls[j];
int pos = shuffle ? (int)(Math.random() * (double)(random_urls.size() + 1)) : j;
random_urls.add(pos, url);
}
trackerUrlLists.add(random_urls);
}
}
}
catch (Exception e)
{
Debug.printStackTrace(e);
}
}
protected String trackerURLListToString()
{
String trackerUrlListString = "[";
for (int i = 0; i < trackerUrlLists.size(); i++)
{
List group = (List)trackerUrlLists.get(i);
trackerUrlListString = (new StringBuilder()).append(trackerUrlListString).append(i != 0 ? "," : "").append("[").toString();
for (int j = 0; j < group.size(); j++)
{
URL u = (URL)group.get(j);
trackerUrlListString = (new StringBuilder()).append(trackerUrlListString).append(j != 0 ? "," : "").append(u.toString()).toString();
}
trackerUrlListString = (new StringBuilder()).append(trackerUrlListString).append("]").toString();
}
trackerUrlListString = (new StringBuilder()).append(trackerUrlListString).append("]").toString();
return trackerUrlListString;
}
protected TRTrackerAnnouncerResponseImpl decodeTrackerResponse(URL url, byte data[])
{
String failure_reason;
if (data == null)
{
failure_reason = "no response";
break MISSING_BLOCK_LABEL_4251;
}
Map metaData;
metaData = BDecoder.decode(data);
Object o = metaData.get("az_ps");
if (o instanceof List)
{
List peer_sources = (List)o;
List x = new ArrayList();
for (int i = 0; i < peer_sources.size(); i++)
{
Object o1 = peer_sources.get(i);
if (o1 instanceof byte[])
x.add(new String((byte[])(byte[])o1));
}
String y[] = new String[x.size()];
x.toArray(y);
announce_data_provider.setPeerSources(y);
}
String warning_message;
boolean log_it;
byte b_warning_message[] = (byte[])(byte[])metaData.get("warning message");
if (b_warning_message == null || !COConfigurationManager.getBooleanParameter("Tracker Client Show Warnings"))
break MISSING_BLOCK_LABEL_344;
warning_message = new String(b_warning_message);
if (warning_message.equals(last_tracker_message))
break MISSING_BLOCK_LABEL_344;
last_tracker_message = warning_message;
log_it = false;
class_mon.enter();
String last_warning_message = (String)tracker_report_map.get(url.getHost());
if (last_warning_message == null || !warning_message.equals(last_warning_message))
{
log_it = true;
tracker_report_map.put(url.getHost(), warning_message);
}
class_mon.exit();
break MISSING_BLOCK_LABEL_289;
Exception exception;
exception;
class_mon.exit();
throw exception;
if (log_it)
Logger.logTextResource(new LogAlert(torrent, false, 1, "TrackerClient.announce.warningmessage"), new String[] {
announce_data_provider.getName(), warning_message
});
break MISSING_BLOCK_LABEL_344;
Throwable e;
e;
Debug.printStackTrace(e);
long time_to_wait;
byte failure_reason_bytes[];
try
{
time_to_wait = ((Long)metaData.get("interval")).longValue();
Long raw_min_interval = (Long)metaData.get("min interval");
if (Logger.isEnabled())
Logger.log(new LogEvent(torrent, LOGID, 0, (new StringBuilder()).append("Received from announce: 'interval' = ").append(time_to_wait).append("; 'min interval' = ").append(raw_min_interval).toString()));
if (time_to_wait < 0L || time_to_wait > 0xffffffffL)
time_to_wait = 0xffffffffL;
if (raw_min_interval != null)
{
min_interval = raw_min_interval.longValue();
if (min_interval < 1L)
{
if (Logger.isEnabled())
Logger.log(new LogEvent(torrent, LOGID, 0, (new StringBuilder()).append("Tracker being silly and returning a 'min interval' of less than 1 second (").append(min_interval).append(")").toString()));
min_interval = 0L;
} else
if (min_interval > time_to_wait)
{
if (Logger.isEnabled())
Logger.log(new LogEvent(torrent, LOGID, 0, (new StringBuilder()).append("Tracker being silly and returning a 'min interval' (").append(min_interval).append(") greater than recommended announce 'interval'").append(" (").append(time_to_wait).append(")").toString()));
min_interval = 0L;
}
}
if (userMinInterval != 0)
{
time_to_wait = Math.max(userMinInterval, time_to_wait);
min_interval = Math.max(min_interval, userMinInterval);
if (Logger.isEnabled())
Logger.log(new LogEvent(torrent, LOGID, 0, (new StringBuilder()).append("Overriding with user settings: 'interval' = ").append(time_to_wait).append("; 'min interval' = ").append(min_interval).toString()));
}
if (time_to_wait > 30L)
time_to_wait -= 10L;
break MISSING_BLOCK_LABEL_863;
}
catch (Exception e)
{
failure_reason_bytes = (byte[])(byte[])metaData.get("failure reason");
}
if (failure_reason_bytes != null)
break MISSING_BLOCK_LABEL_830;
if (Logger.isEnabled())
Logger.log(new LogEvent(torrent, LOGID, 1, (new StringBuilder()).append("Problems with Tracker, will retry in ").append(getErrorRetryInterval()).append("ms").toString()));
return new TRTrackerAnnouncerResponseImpl(url, torrent_hash, 0, getErrorRetryInterval(), "Unknown cause");
failure_reason = new String(failure_reason_bytes, "UTF8");
return new TRTrackerAnnouncerResponseImpl(url, torrent_hash, 1, getErrorRetryInterval(), failure_reason);
TRTrackerAnnouncerResponseImpl resp;
Long incomplete_l = (Long)metaData.get("incomplete");
Long complete_l = (Long)metaData.get("complete");
if ((incomplete_l != null || complete_l != null) && Logger.isEnabled())
Logger.log(new LogEvent(torrent, LOGID, (new StringBuilder()).append("ANNOUNCE SCRAPE1: seeds=").append(complete_l).append(" peers=").append(incomplete_l).toString()));
byte trackerid[] = (byte[])(byte[])metaData.get("tracker id");
if (trackerid != null)
tracker_id = new String(trackerid);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -