📄 trtrackerbtannouncerimpl.java
字号:
return( failure_reason );
}
protected long
getLongURLParam(
String url,
String param )
{
String val = getURLParam( url, param );
if( val == null ){
return(0);
}
return( Long.parseLong( val ));
}
protected String
getURLParam(
String url,
String param )
{
int p1 = url.indexOf( param + "=" );
if ( p1 == -1 ){
return( null );
}
int p2 = url.indexOf( "&", p1 );
if ( p2 == -1 ){
return( url.substring(p1+param.length()+1));
}
return( url.substring(p1+param.length()+1,p2));
}
protected String
exceptionToString(
Throwable e )
{
String class_name = e.getClass().getName();
int pos = class_name.lastIndexOf( '.' );
if ( pos != -1 ){
class_name = class_name.substring(pos+1);
}
String str = class_name + ":" + e.getMessage();
if ( str.indexOf( "timed out") != -1 ){
str = "timeout";
}
return( str );
}
public URL
constructUrl(
String evt,
URL _url)
throws Exception
{
String url = _url.toString();
StringBuffer request = new StringBuffer(url);
// if url already has a query component then just append our parameters on the end
if ( url.indexOf('?') != -1 ){
request.append('&');
}else{
request.append('?');
}
// the client-id stuff RELIES on info_hash being the FIRST parameter added by
// us to the URL, so don't change it!
request.append(info_hash);
request.append(tracker_peer_id_str);
request.append(port);
request.append("&uploaded=").append(announce_data_provider.getTotalSent());
request.append("&downloaded=").append(announce_data_provider.getTotalReceived());
request.append("&left=").append(announce_data_provider.getRemaining());
//TrackerID extension
if( tracker_id.length() > 0 ) {
request.append( "&trackerid=").append(tracker_id );
}
if (evt.length() != 0) {
request.append("&event=").append(evt);
}
if (evt.equals("stopped")){
request.append("&numwant=0");
}else {
//calculate how many peers we should ask for
int numwant = calculateNumWant();
request.append("&numwant=").append(numwant);
//no_peer_id has been made obsolete by 'compact'
}
// actually, leave this in, ask PARG why!
request.append("&no_peer_id=1");
// latest space saving measure, a compact return type where peers are returned
// as 6 byte entries in a single byte[] (4 bytes ip, 2 byte port)
// leave this as always supplied, ask PARG why
request.append( "&compact=1" );
// any explicit override takes precedence over any implicit override added
// when hosting torrents
String explicit_ips = COConfigurationManager.getStringParameter( "Override Ip", "" );
String ip = null;
String tracker_network = AENetworkClassifier.categoriseAddress( _url.getHost());
// make sure this tracker network is enabled
boolean network_ok = false;
boolean 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] == AENetworkClassifier.AT_PUBLIC ){
normal_network_ok = true;
}
if ( peer_networks[i] == tracker_network ){
network_ok = true;
}
}
}
if ( !network_ok ){
throw( new Exception( "Network not enabled for url '" + _url + "'" ));
}
String normal_explicit = null;
if ( explicit_ips.length() > 0 ){
// gotta select an appropriate override based on network type
StringTokenizer tok = new StringTokenizer( explicit_ips, ";" );
while( tok.hasMoreTokens()){
String this_address = (String)tok.nextToken().trim();
if ( this_address.length() > 0 ){
String cat = AENetworkClassifier.categoriseAddress( this_address );
if ( cat == AENetworkClassifier.AT_PUBLIC ){
normal_explicit = this_address;
}
if ( tracker_network == cat ){
ip = this_address;
break;
}
}
}
}
if ( ip == null ){
// if we have a normal explicit override and this is enabled then use it
if ( normal_network_ok && normal_explicit != null ){
ip = normal_explicit;
}else{
if ( ip_override != null ){
ip = ip_override;
}
}
}
if ( ip != null ){
if ( tracker_network == AENetworkClassifier.AT_PUBLIC ){
try{
ip = PRHelpers.DNSToIPAddress( ip );
}catch( UnknownHostException e){
if (Logger.isEnabled())
Logger.log(new LogEvent(torrent, LOGID, LogEvent.LT_ERROR,
"IP Override host resolution of '" + ip
+ "' fails, using unresolved address"));
}
}
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 ){
request.append( ext );
}
return new URL( request.toString());
}
protected int
calculateNumWant()
{
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)
{
try{
this_mon.enter();
announce_data_provider = _provider;
}finally{
this_mon.exit();
}
}
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( 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( 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();
//This entry is present on multi-tracker torrents
TOTorrentAnnounceURLSet[] announce_sets = torrent.getAnnounceURLGroup().getAnnounceURLSets();
if ( announce_sets.length == 0 ){
//If not present, we use the default specification
URL url = torrent.getAnnounceURL();
//We then contruct a list of one element, containing this url, and put this list
//into the list of lists of urls.
List list = new ArrayList();
list.add(url);
trackerUrlLists.add(list);
}else{
//Ok we have a multi-tracker torrent
for(int i = 0 ; i < announce_sets.length ; i++){
//Each list contains a list of urls
URL[] urls = announce_sets[i].getAnnounceURLs();
List random_urls = new ArrayList();
for(int j = 0 ; j < urls.length; j++){
//System.out.println(urls.get(j).getClass());
URL url = urls[j];
//Shuffle
int pos = shuffle?(int)(Math.random() * (random_urls.size()+1)):j;
random_urls.add(pos,url);
}
//Add this list to the list
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 += (i==0?"":",") + "[";
for (int j=0;j<group.size();j++){
URL u = (URL)group.get(j);
trackerUrlListString += (j==0?"":",") + u.toString();
}
trackerUrlListString += "]";
}
trackerUrlListString += "]";
return( trackerUrlListString );
}
protected TRTrackerAnnouncerResponseImpl
decodeTrackerResponse(
URL url,
byte[] data )
{
String failure_reason;
if ( data == null ){
failure_reason = "no response";
}else{
try{
//parse the metadata
try{
Map metaData = BDecoder.decode(data); //$NON-NLS-1$
// handle any user warnings in the response
try{
byte[] b_warning_message = (byte[])metaData.get( "warning message" );
if ( b_warning_message != null &&
COConfigurationManager.getBooleanParameter( "Tracker Client Show Warnings" )){
String warning_message = new String(b_warning_message);
// don't report the same message twice per torrent
if ( !warning_message.equals( last_tracker_message )){
last_tracker_message = warning_message;
boolean log_it = false;
// only report a given message once per tracker
try{
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 );
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -