📄 trtrackerbtannouncerimpl.java
字号:
peer.put( "ip", PRHelpers.intToAddress(addresses[i]).getBytes());
peer.put( "port", new Long( ports[i]));
}
byte[] data = BEncoder.encode( map );
message.write( data );
return( null );
}
PRUDPPacketReplyAnnounce2 announce_reply = (PRUDPPacketReplyAnnounce2)reply;
Map map = new HashMap();
map.put( "interval", new Long( announce_reply.getInterval()));
int[] addresses = announce_reply.getAddresses();
short[] ports = announce_reply.getPorts();
map.put( "complete", new Long(announce_reply.getSeeders()));
map.put( "incomplete", new Long(announce_reply.getLeechers()));
List peers = new ArrayList();
map.put( "peers", peers );
for (int i=0;i<addresses.length;i++){
Map peer = new HashMap();
peers.add( peer );
peer.put( "ip", PRHelpers.intToAddress(addresses[i]).getBytes());
peer.put( "port", new Long( ports[i]));
}
byte[] data = BEncoder.encode( map );
message.write( data );
return( null );
}
failure_reason = ((PRUDPPacketReplyError)reply).getMessage();
}else{
failure_reason = ((PRUDPPacketReplyError)reply).getMessage();
}
}catch( PRUDPPacketHandlerException e ){
if ( e.getMessage() == null || e.getMessage().indexOf("timed out") == -1 ){
throw( e );
}
}
}
}catch( Throwable e ){
failure_reason = exceptionToString(e);
}
if ( auth != null ){
SESecurityManager.setPasswordAuthenticationOutcome( UDP_REALM, reqUrl, false );
}
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);
String port_details = TRTrackerUtils.getPortsForURL();
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());
//TrackerID extension
if( tracker_id.length() > 0 ) {
request.append( "&trackerid=").append(tracker_id );
}
if (evt.length() != 0) {
request.append("&event=").append(evt);
}
boolean stopped = evt.equals("stopped");
if ( stopped ){
request.append("&numwant=0");
if ( stopped_for_queue ){
request.append( "&azq=1" );
}
}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 = 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 ){
// sanitise it
while ( ext.startsWith("&")){
ext = ext.substring( 1 );
}
request.append( "&" );
request.append( ext );
}
request.append( "&azver=" + TRTrackerAnnouncer.AZ_TRACKER_VERSION_CURRENT );
if ( az_tracker && !stopped ){
int up = announce_data_provider.getUploadSpeedKBSec( evt.equals( "started" ));
if ( up > 0 ){
request.append( "&azup=" + up );
}
DHTNetworkPosition best_position = DHTNetworkPositionManager.getBestLocalPosition();
if ( best_position != null ){
try{
byte[] bytes = DHTNetworkPositionManager.serialisePosition( best_position );
request.append( "&aznp=" + Base32.encode( bytes ));
}catch( Throwable e ){
Debug.printStackTrace( e );
}
}
}
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();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -