blob: c2ed1372c4058af8ae6a227ecb0e7181f662f735 [file] [log] [blame]
root59a69f82025-06-05 08:35:22 +00001package tracker;
2
3import java.io.InputStream;
4import java.io.OutputStream;
5import java.net.HttpURLConnection;
TRM-coding87c24972025-06-07 14:05:29 +08006import java.net.InetSocketAddress;
7import java.net.SocketAddress;
root59a69f82025-06-05 08:35:22 +00008import java.net.URL;
9
10import org.simpleframework.http.Request;
11import org.simpleframework.http.Response;
12import org.simpleframework.http.core.Container;
13
14/**
15 * 拦截 announce 请求,打印参数后转发给真实 Tracker。
16 */
17public class DataCaptureProxy implements Container {
18
19 private final String trackerHost;
20 private final int trackerPort;
TRM-codingcdfe5482025-06-06 17:31:01 +080021 private final Tracker tracker;
root59a69f82025-06-05 08:35:22 +000022
23 public DataCaptureProxy(String trackerHost, int trackerPort) {
24 this.trackerHost = trackerHost;
25 this.trackerPort = trackerPort;
TRM-coding87c24972025-06-07 14:05:29 +080026 this.tracker = new Tracker(); // 初始化 Tracker 实例
root59a69f82025-06-05 08:35:22 +000027 }
28
29 @Override
30 public void handle(Request req, Response resp) {
31 try {
32 // 提取并打印关键参数
TRM-coding87c24972025-06-07 14:05:29 +080033 String infoHash = req.getParameter("info_hash");
34 String uploaded = req.getParameter("uploaded");
35 String downloaded = req.getParameter("downloaded");
36 String passkey = req.getParameter("passkey");
37
38 // 获取客户端IP地址
39 String clientIp;
40 // 直接从 TCP 连接(socket 源地址)中读取
41 SocketAddress socketAddress = req.getClientAddress();
42 if (socketAddress instanceof InetSocketAddress) {
43 clientIp = ((InetSocketAddress) socketAddress)
44 .getAddress()
45 .getHostAddress();
46 } else {
47 // 兜底写法,将整个 SocketAddress 转为字符串
48 clientIp = socketAddress.toString();
49 }
50
root59a69f82025-06-05 08:35:22 +000051 System.out.println(
52 "Captured announce → info_hash=" + infoHash +
53 ", uploaded=" + uploaded +
54 ", downloaded=" + downloaded +
TRM-coding87c24972025-06-07 14:05:29 +080055 ", passkey=" + passkey +
56 ", client_ip=" + clientIp
root59a69f82025-06-05 08:35:22 +000057 );
58
TRM-coding87c24972025-06-07 14:05:29 +080059 // 调用 Tracker 方法更新上传和下载数据
TRM-codingcdfe5482025-06-06 17:31:01 +080060 if (passkey != null && !passkey.isEmpty()) {
61 try {
62 if (uploaded != null && !uploaded.isEmpty()) {
63 int uploadValue = Integer.parseInt(uploaded);
64 if (uploadValue > 0) {
65 tracker.AddUpLoad(passkey, uploadValue);
66 }
67 }
68
69 if (downloaded != null && !downloaded.isEmpty()) {
70 int downloadValue = Integer.parseInt(downloaded);
71 if (downloadValue > 0) {
72 tracker.AddDownload(passkey, downloadValue);
73 }
74 }
75 } catch (NumberFormatException e) {
76 System.err.println("Error parsing upload/download values: " + e.getMessage());
77 }
78 }
79
root59a69f82025-06-05 08:35:22 +000080 // 构造转发 URL
TRM-coding87c24972025-06-07 14:05:29 +080081 String path = req.getPath().getPath();
root59a69f82025-06-05 08:35:22 +000082 String query = req.getQuery().toString();
83 String targetUrl = "http://" + trackerHost + ":" + trackerPort
84 + path + "?" + query;
85
86 HttpURLConnection connection =
87 (HttpURLConnection) new URL(targetUrl).openConnection();
88 connection.setRequestMethod("GET");
89
90 // 转发响应码和类型
91 resp.setCode(connection.getResponseCode());
92 String ct = connection.getContentType();
93 if (ct != null) resp.setValue("Content-Type", ct);
94
95 // 转发响应体
96 try (InputStream in = connection.getInputStream();
97 OutputStream out = resp.getOutputStream()) {
98 byte[] buf = new byte[8192];
99 int len;
100 while ((len = in.read(buf)) != -1) {
101 out.write(buf, 0, len);
102 }
103 }
104
105 } catch (Exception e) {
106 try {
107 resp.setCode(500);
108 resp.close();
109 } catch (Exception ignore) {}
110 e.printStackTrace();
111 }
112 }
113}