📄 trblockingserverprocessor.java
字号:
// Decompiled by Jad v1.5.8e2. Copyright 2001 Pavel Kouznetsov.
// Jad home page: http://kpdus.tripod.com/jad.html
// Decompiler options: packimports(3) fieldsfirst ansi space
// Source File Name: TRBlockingServerProcessor.java
package org.gudy.azureus2.core3.tracker.server.impl.tcp.blocking;
import java.io.*;
import java.net.*;
import org.gudy.azureus2.core3.logging.*;
import org.gudy.azureus2.core3.tracker.server.TRTrackerServerException;
import org.gudy.azureus2.core3.tracker.server.impl.tcp.TRTrackerServerProcessorTCP;
import org.gudy.azureus2.core3.tracker.server.impl.tcp.TRTrackerServerTCP;
import org.gudy.azureus2.core3.util.AETemporaryFileHandler;
public class TRBlockingServerProcessor extends TRTrackerServerProcessorTCP
{
private static final LogIDs LOGID;
protected Socket socket;
protected int timeout_ticks;
protected String current_request;
protected TRBlockingServerProcessor(TRTrackerServerTCP _server, Socket _socket)
{
super(_server);
timeout_ticks = 1;
socket = _socket;
}
public void runSupport()
{
String header_plus;
setTaskState("entry");
try
{
socket.setSoTimeout(5000);
}
catch (SocketException e) { }
header_plus = "";
setTaskState("reading header");
InputStream post_is;
File post_file;
String actual_header;
String lowercase_header;
boolean head;
String url;
InputStream is = socket.getInputStream();
byte buffer[] = new byte[1024];
do
{
if (header_plus.length() >= 4096)
break;
int len = is.read(buffer);
if (len == -1)
break;
header_plus = (new StringBuilder()).append(header_plus).append(new String(buffer, 0, len, "ISO-8859-1")).toString();
} while (!header_plus.endsWith("\r\n\r\n") && header_plus.indexOf("\r\n\r\n") == -1);
if (Logger.isEnabled())
{
String log_str = header_plus;
int pos = log_str.indexOf("\r\n");
if (pos != -1)
log_str = log_str.substring(0, pos);
Logger.log(new LogEvent(LOGID, (new StringBuilder()).append("Tracker Server: received header '").append(log_str).append("'").toString()));
}
post_is = null;
post_file = null;
head = false;
if (header_plus.startsWith("GET "))
{
timeout_ticks = 1;
actual_header = header_plus;
lowercase_header = actual_header.toLowerCase();
url = actual_header.substring(4).trim();
} else
if (header_plus.startsWith("HEAD "))
{
timeout_ticks = 1;
actual_header = header_plus;
lowercase_header = actual_header.toLowerCase();
url = actual_header.substring(4).trim();
head = true;
} else
if (header_plus.startsWith("POST "))
{
timeout_ticks = TRTrackerServerTCP.PROCESSING_POST_MULTIPLIER;
if (timeout_ticks == 0)
setTimeoutsDisabled(true);
setTaskState("reading content");
int header_end = header_plus.indexOf("\r\n\r\n");
if (header_end == -1)
throw new TRTrackerServerException("header truncated");
actual_header = header_plus.substring(0, header_end + 4);
lowercase_header = actual_header.toLowerCase();
url = actual_header.substring(4).trim();
int cl_start = lowercase_header.indexOf("content-length:");
if (cl_start == -1)
throw new TRTrackerServerException("header Content-Length start missing");
int cl_end = actual_header.indexOf("\r\n", cl_start);
if (cl_end == -1)
throw new TRTrackerServerException("header Content-Length end missing");
int content_length = Integer.parseInt(actual_header.substring(cl_start + 15, cl_end).trim());
ByteArrayOutputStream baos = null;
FileOutputStream fos = null;
OutputStream data_os;
if (content_length <= 0x40000)
{
baos = new ByteArrayOutputStream();
data_os = baos;
} else
{
post_file = AETemporaryFileHandler.createTempFile();
post_file.deleteOnExit();
fos = new FileOutputStream(post_file);
data_os = fos;
}
int rem = header_plus.length() - (header_end + 4);
if (rem > 0)
{
content_length -= rem;
data_os.write(header_plus.substring(header_plus.length() - rem).getBytes("ISO-8859-1"));
}
int len;
for (; content_length > 0; content_length -= len)
{
len = is.read(buffer);
if (len < 0)
throw new TRTrackerServerException("premature end of input stream");
data_os.write(buffer, 0, len);
}
if (baos != null)
{
post_is = new ByteArrayInputStream(baos.toByteArray());
} else
{
fos.close();
post_is = new BufferedInputStream(new FileInputStream(post_file), 0x40000);
}
} else
{
int pos = header_plus.indexOf(' ');
if (pos == -1)
throw new TRTrackerServerException("header doesn't have space in right place");
timeout_ticks = 1;
actual_header = header_plus;
lowercase_header = actual_header.toLowerCase();
url = actual_header.substring(pos + 1).trim();
}
setTaskState("processing request");
current_request = actual_header;
if (post_is == null)
post_is = new ByteArrayInputStream(new byte[0]);
int pos = url.indexOf(" ");
if (pos == -1)
throw new TRTrackerServerException("header doesn't have space in right place");
url = url.substring(0, pos);
if (head)
{
ByteArrayOutputStream head_response = new ByteArrayOutputStream(4096);
processRequest(actual_header, lowercase_header, url, (InetSocketAddress)socket.getRemoteSocketAddress(), false, post_is, head_response, null);
byte head_data[] = head_response.toByteArray();
int header_length = head_data.length;
int i = 3;
do
{
if (i >= head_data.length)
break;
if (head_data[i - 3] == 13 && head_data[i - 2] == 10 && head_data[i - 1] == 13 && head_data[i] == 10)
{
header_length = i + 1;
break;
}
i++;
} while (true);
setTaskState("writing head response");
socket.getOutputStream().write(head_data, 0, header_length);
socket.getOutputStream().flush();
} else
{
processRequest(actual_header, lowercase_header, url, (InetSocketAddress)socket.getRemoteSocketAddress(), false, post_is, socket.getOutputStream(), null);
}
if (post_is != null)
post_is.close();
if (post_file != null)
post_file.delete();
break MISSING_BLOCK_LABEL_1005;
Exception exception;
exception;
if (post_is != null)
post_is.close();
if (post_file != null)
post_file.delete();
throw exception;
SocketTimeoutException e;
e;
break MISSING_BLOCK_LABEL_1005;
e;
setTaskState("final socket close");
try
{
socket.close();
}
catch (Throwable e) { }
break MISSING_BLOCK_LABEL_1048;
Exception exception1;
exception1;
setTaskState("final socket close");
try
{
socket.close();
}
catch (Throwable e) { }
throw exception1;
}
public void interruptTask()
{
try
{
if (!areTimeoutsDisabled())
{
timeout_ticks--;
if (timeout_ticks <= 0)
{
System.out.println((new StringBuilder()).append("Tracker task interrupted in state '").append(getTaskState()).append("' : processing time limit exceeded for ").append(socket.getInetAddress()).toString());
socket.close();
}
}
}
catch (Throwable e) { }
}
static
{
LOGID = LogIDs.TRACKER;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -