📄 trtrackerserverprocessortcp.java
字号:
else
if (lhs.equals("cryptoport"))
crypto_port = Integer.parseInt(rhs);
else
if (lhs.equals("azq"))
stop_to_queue = true;
else
if (lhs.equals("azsf"))
scrape_flags = rhs;
else
if (lhs.equals("link"))
link = rhs;
else
if (lhs.equals("outform"))
{
if (rhs.equals("xml"))
xml_output = true;
} else
if (lhs.equals("hide"))
hide = Integer.parseInt(rhs) == 1;
else
if (TRTrackerServerImpl.supportsExtensions())
if (lhs.equals("aznp"))
try
{
network_position = DHTNetworkPositionManager.deserialisePosition(client_address.getAddress(), Base32.decode(rhs));
}
catch (Throwable e) { }
else
if (lhs.equals("azup"))
up_speed = Integer.parseInt(rhs);
} while (p1 != -1);
if (hide)
{
tcp_port = 0;
crypto_port = 0;
http_port = 0;
udp_port = 0;
}
if (crypto_level == 2 && crypto_port != 0)
tcp_port = crypto_port;
byte hashes[][] = (byte[][])null;
if (hash_list != null)
{
hashes = new byte[hash_list.size()][];
hash_list.toArray(hashes);
} else
if (hash != null)
hashes = (new byte[][] {
hash
});
if (xml_output)
compact_mode = 16;
else
if (az_ver >= 2)
compact_mode = 3;
Map root_out[] = new Map[1];
TRTrackerServerPeerImpl peer_out[] = new TRTrackerServerPeerImpl[1];
specific_torrent = processTrackerRequest(server, str, root_out, peer_out, request_type, hashes, link, scrape_flags, peer_id, no_peer_id, compact_mode, key, event, stop_to_queue, tcp_port & 0xffff, udp_port & 0xffff, http_port & 0xffff, real_ip_address, client_ip_address, downloaded, uploaded, left, num_want, crypto_level, (byte)az_ver, up_speed, network_position);
root = root_out[0];
if (request_type == 2 && lowercase_input_header.indexOf(lc_azureus_name) != -1)
root.put("aztracker", new Long(1L));
if (root.get("_data") == null)
{
org.gudy.azureus2.core3.tracker.server.TRTrackerServerPeer post_process_peer = peer_out[0];
if (post_process_peer == null)
post_process_peer = new org.gudy.azureus2.core3.tracker.server.impl.TRTrackerServerProcessor.lightweightPeer(client_ip_address, tcp_port, peer_id);
server.postProcess(post_process_peer, specific_torrent, request_type, str, root);
}
break MISSING_BLOCK_LABEL_2006;
Exception e;
e;
String warning_message;
Map error_entries;
TRTrackerServerException tr_excep;
warning_message = null;
error_entries = null;
if (!(e instanceof TRTrackerServerException))
break MISSING_BLOCK_LABEL_1914;
tr_excep = (TRTrackerServerException)e;
int reason = tr_excep.getResponseCode();
error_entries = tr_excep.getErrorEntries();
if (reason == -1)
break MISSING_BLOCK_LABEL_1896;
String resp = (new StringBuilder()).append("HTTP/1.1 ").append(reason).append(" ").append(tr_excep.getResponseText()).append("\r\n").toString();
Map headers = tr_excep.getResponseHeaders();
for (Iterator it = headers.entrySet().iterator(); it.hasNext();)
{
java.util.Map.Entry entry = (java.util.Map.Entry)it.next();
String key = (String)entry.getKey();
String value = (String)entry.getValue();
resp = (new StringBuilder()).append(resp).append(key).append(": ").append(value).append("\r\n").toString();
}
byte payload[] = null;
if (error_entries != null)
{
payload = BEncoder.encode(error_entries);
resp = (new StringBuilder()).append(resp).append("Content-Length: ").append(payload.length).append("\r\n").toString();
}
resp = (new StringBuilder()).append(resp).append("\r\n").toString();
os.write(resp.getBytes());
if (payload != null)
os.write(payload);
os.flush();
setTaskState("final os flush");
os.flush();
return;
if (tr_excep.isUserMessage())
warning_message = tr_excep.getMessage();
break MISSING_BLOCK_LABEL_1927;
if (e instanceof NullPointerException)
e.printStackTrace();
String message = e.getMessage();
if (message == null || message.length() == 0)
message = e.toString();
root = new HashMap();
root.put("failure reason", message);
if (warning_message != null)
root.put("warning message", warning_message);
if (error_entries != null)
root.putAll(error_entries);
setTaskState("writing response");
byte data[];
byte header_start[];
if (xml_output)
{
StringBuffer xml = new StringBuffer("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
xml.append("<RESULT>");
if (specific_torrent != null)
{
xml.append("<BTIH>");
xml.append(ByteFormatter.encodeString(specific_torrent.getHash().getBytes()));
xml.append("</BTIH>");
xml.append(BEncoder.encodeToXML(root, true));
}
xml.append("</RESULT>");
data = xml.toString().getBytes("UTF-8");
header_start = HTTP_RESPONSE_XML_START;
} else
{
data = (byte[])(byte[])root.get("_data");
if (data == null)
{
data = BEncoder.encode(root);
if (data.length > 0xf4240)
{
File dump = new File("bdecoder.dump");
synchronized (org/gudy/azureus2/core3/tracker/server/impl/tcp/TRTrackerServerProcessorTCP)
{
try
{
Debug.out((new StringBuilder()).append("Output is too large, saving diagnostics to ").append(dump.toString()).toString());
PrintWriter pw = new PrintWriter(new FileWriter(dump));
BDecoder.print(pw, root);
pw.close();
}
catch (Throwable e) { }
}
}
root.put("_data", data);
}
header_start = HTTP_RESPONSE_START;
}
if (gzip_reply)
{
byte gzip_data[] = (byte[])(byte[])root.get("_gzipdata");
if (gzip_data == null)
{
ByteArrayOutputStream tos = new ByteArrayOutputStream(data.length);
GZIPOutputStream gos = new GZIPOutputStream(tos);
gos.write(data);
gos.close();
gzip_data = tos.toByteArray();
root.put("_gzipdata", gzip_data);
}
data = gzip_data;
}
setTaskState("writing header");
os.write(header_start);
byte length_bytes[] = String.valueOf(data.length).getBytes();
os.write(length_bytes);
int header_len = header_start.length + length_bytes.length;
setTaskState("writing content");
if (gzip_reply)
{
os.write(HTTP_RESPONSE_END_GZIP);
header_len += HTTP_RESPONSE_END_GZIP.length;
} else
{
os.write(HTTP_RESPONSE_END_NOGZIP);
header_len += HTTP_RESPONSE_END_NOGZIP.length;
}
os.write(data);
server.updateStats(request_type, specific_torrent, input_header.length(), header_len + data.length);
setTaskState("final os flush");
os.flush();
break MISSING_BLOCK_LABEL_2492;
Exception exception1;
exception1;
setTaskState("final os flush");
os.flush();
throw exception1;
}
protected String doAuthentication(String url_path, String header, OutputStream os, boolean tracker)
throws IOException
{
int x;
boolean apply_web_password = !tracker && server.isWebPasswordEnabled();
boolean apply_torrent_password = tracker && server.isTrackerPasswordEnabled();
if (apply_web_password && server.isWebPasswordHTTPSOnly() && !server.isSSL())
{
os.write("HTTP/1.1 403 BAD\r\n\r\nAccess Denied\r\n".getBytes());
os.flush();
return null;
}
if (!apply_torrent_password && !apply_web_password)
break MISSING_BLOCK_LABEL_618;
x = header.indexOf("Authorization:");
if (x != -1)
break MISSING_BLOCK_LABEL_230;
if (!server.hasExternalAuthorisation())
break MISSING_BLOCK_LABEL_575;
URL resource;
String resource_str = (new StringBuilder()).append(server.isSSL() ? "https" : "http").append("://").append(UrlUtils.convertIPV6Host(server.getHost())).append(":").append(server.getPort()).append(url_path).toString();
resource = new URL(resource_str);
if (server.performExternalAuthorisation(resource, "", ""))
return "";
break MISSING_BLOCK_LABEL_575;
MalformedURLException e;
e;
Debug.printStackTrace(e);
break MISSING_BLOCK_LABEL_575;
String user;
String pw;
boolean auth_failed;
int p1 = header.indexOf(' ', x);
int p2 = header.indexOf(' ', p1 + 1);
String body = header.substring(p2, header.indexOf('\r', p2)).trim();
String decoded = new String(Base64.decode(body));
int cp = decoded.indexOf(':');
user = decoded.substring(0, cp);
pw = decoded.substring(cp + 1);
auth_failed = false;
if (!server.hasExternalAuthorisation())
break MISSING_BLOCK_LABEL_440;
URL resource;
String resource_str = (new StringBuilder()).append(server.isSSL() ? "https" : "http").append("://").append(UrlUtils.convertIPV6Host(server.getHost())).append(":").append(server.getPort()).append(url_path).toString();
resource = new URL(resource_str);
if (server.performExternalAuthorisation(resource, user, pw))
return user;
break MISSING_BLOCK_LABEL_437;
MalformedURLException e;
e;
Debug.printStackTrace(e);
auth_failed = true;
if (!server.hasInternalAuthorisation() || auth_failed)
break MISSING_BLOCK_LABEL_575;
byte encoded[];
byte internal_pw[];
SHA1Hasher hasher = new SHA1Hasher();
byte password[] = pw.getBytes();
if (password.length > 0)
encoded = hasher.calculateHash(password);
else
encoded = new byte[0];
if (!user.equals("<internal>"))
break MISSING_BLOCK_LABEL_532;
internal_pw = Base64.decode(pw);
if (Arrays.equals(internal_pw, server.getPassword()))
return user;
break MISSING_BLOCK_LABEL_575;
if (user.equalsIgnoreCase(server.getUsername()) && Arrays.equals(encoded, server.getPassword()))
return user;
break MISSING_BLOCK_LABEL_575;
hasher;
Debug.printStackTrace(hasher);
os.write((new StringBuilder()).append("HTTP/1.1 401 BAD\r\nWWW-Authenticate: Basic realm=\"").append(server.getName()).append("\"\r\n\r\nAccess Denied\r\n").toString().getBytes());
os.flush();
return null;
return "";
}
protected boolean handleExternalRequest(InetSocketAddress client_address, String user, String url, String header, InputStream is, OutputStream os, AsyncController async)
throws IOException
{
URL absolute_url = new URL((new StringBuilder()).append(server_url).append(url.startsWith("/") ? url : (new StringBuilder()).append("/").append(url).toString()).toString());
return server.handleExternalRequest(client_address, user, url, absolute_url, header, is, os, async);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -