blob: 4d2737f64757629b543a31d5d5c3fea22d593348 [file] [log] [blame]
package tracker;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import org.simpleframework.http.Request;
import org.simpleframework.http.Response;
import org.simpleframework.http.core.Container;
/**
* 拦截 announce 请求,打印参数后转发给真实 Tracker。
*/
public class DataCaptureProxy implements Container {
private final String trackerHost;
private final int trackerPort;
public DataCaptureProxy(String trackerHost, int trackerPort) {
this.trackerHost = trackerHost;
this.trackerPort = trackerPort;
}
@Override
public void handle(Request req, Response resp) {
try {
// 提取并打印关键参数
String infoHash = req.getParameter("info_hash");
String uploaded = req.getParameter("uploaded");
String downloaded= req.getParameter("downloaded");
String passkey = req.getParameter("passkey");
System.out.println(
"Captured announce → info_hash=" + infoHash +
", uploaded=" + uploaded +
", downloaded=" + downloaded +
", passkey=" + passkey
);
// 构造转发 URL
String path = req.getPath().getPath();
String query = req.getQuery().toString();
String targetUrl = "http://" + trackerHost + ":" + trackerPort
+ path + "?" + query;
HttpURLConnection connection =
(HttpURLConnection) new URL(targetUrl).openConnection();
connection.setRequestMethod("GET");
// 转发响应码和类型
resp.setCode(connection.getResponseCode());
String ct = connection.getContentType();
if (ct != null) resp.setValue("Content-Type", ct);
// 转发响应体
try (InputStream in = connection.getInputStream();
OutputStream out = resp.getOutputStream()) {
byte[] buf = new byte[8192];
int len;
while ((len = in.read(buf)) != -1) {
out.write(buf, 0, len);
}
}
} catch (Exception e) {
try {
resp.setCode(500);
resp.close();
} catch (Exception ignore) {}
e.printStackTrace();
}
}
}