更清晰的日志显示
Change-Id: Ia0f3d6e009bfd1b38543f2e515604c126cef5ec6
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/Tool/BT/IPUtils.java b/ruoyi-admin/src/main/java/com/ruoyi/web/Tool/BT/IPUtils.java
index 16c27ae..113ce2e 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/Tool/BT/IPUtils.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/Tool/BT/IPUtils.java
@@ -6,6 +6,8 @@
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
+import java.util.Enumeration;
+
/**
* 获取请求主机IP地址工具
*
@@ -30,12 +32,12 @@
//打印头信息
-// Enumeration enums = request.getHeaderNames();
-// while (enums.hasMoreElements()) {
-// String headerName = (String) enums.nextElement();
-// String headerValue = request.getHeader(headerName);
-// log.info(headerName + ":" + headerValue);
-// }
+ Enumeration enums = request.getHeaderNames();
+ while (enums.hasMoreElements()) {
+ String headerName = (String) enums.nextElement();
+ String headerValue = request.getHeader(headerName);
+ log.info(headerName + ":" + headerValue);
+ }
return getIpAddr(request);
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/BT/TrackerController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/BT/TrackerController.java
index 45813ae..c4c0152 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/BT/TrackerController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/BT/TrackerController.java
@@ -3,6 +3,7 @@
import cn.hutool.core.util.HexUtil;
import com.ruoyi.web.Server.AnnounceService;
+import com.ruoyi.web.controller.common.exception.TrackerException;
import com.ruoyi.web.dao.BT.AnnounceRequest;
import com.ruoyi.web.Tool.BT.BencodeUtil;
import com.ruoyi.web.Tool.BT.BinaryFieldUtil;
@@ -13,6 +14,7 @@
import org.apache.commons.lang3.StringUtils;
import org.springframework.web.bind.annotation.*;
+import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
@@ -46,23 +48,57 @@
String queryStrings = request.getQueryString();
log.info("收到announce汇报:" + queryStrings);
- String ipAddr = IPUtils.getIpAddr();
- byte[] peerId = BinaryFieldUtil.matchPeerId(queryStrings);
- String peerIdHex = HexUtil.encodeHexStr(peerId);
+ // 获取客户端真实IP
+ String ipAddr = request.getRemoteAddr();
+ String xffHeader = request.getHeader("X-Forwarded-For");
+ if (xffHeader != null) {
+ ipAddr = xffHeader.split(",")[0];
+ }
+ log.debug("客户端IP: {}", ipAddr);
- announceRequest.setSeeder(announceRequest.getLeft().equals(0L));
- announceRequest.setInfoHash(BinaryFieldUtil.matchInfoHash(queryStrings));
- announceRequest.setPeerId(peerId);
- announceRequest.setPeerIdHex(peerIdHex);
- announceRequest.setRemoteAddr(ipAddr);
- announceRequest.setWantDigest(wantDigest);
- announceRequest.setUserAgent(ua);
+ // 解析并验证peer_id
+ try {
+ byte[] peerId = BinaryFieldUtil.matchPeerId(queryStrings);
+ if (peerId.length != 20) {
+ throw new TrackerException("Invalid peer_id length: " + peerId.length);
+ }
+ String peerIdHex = HexUtil.encodeHexStr(peerId);
- Map<String, Object> response = announceService.announce(announceRequest);
+ announceRequest.setSeeder(announceRequest.getLeft().equals(0L));
+ announceRequest.setInfoHash(BinaryFieldUtil.matchInfoHash(queryStrings));
+ announceRequest.setPeerId(peerId);
+ announceRequest.setPeerIdHex(peerIdHex);
+ announceRequest.setRemoteAddr(ipAddr);
+ announceRequest.setWantDigest(wantDigest);
+ announceRequest.setUserAgent(ua);
- String responseStr = BencodeUtil.encode(response);
- return responseStr;
+ // 验证passkey
+ String passkey = extractPasskey(queryStrings);
+ announceRequest.setPasskey(passkey);
+
+ // 处理请求
+ Map<String, Object> response = announceService.announce(announceRequest);
+ return BencodeUtil.encode(response);
+
+ } catch (Exception e) {
+ log.error("处理announce请求失败", e);
+ Map<String, Object> errorResponse = new HashMap<>();
+ errorResponse.put("failure reason", e.getMessage());
+ return BencodeUtil.encode(errorResponse);
+ }
+ }
+
+ // 从queryString中提取passkey的辅助方法
+ private String extractPasskey(String queryString) {
+ if (queryString == null) return null;
+ String[] params = queryString.split("&");
+ for (String param : params) {
+ if (param.startsWith("passkey=")) {
+ return param.substring("passkey=".length());
+ }
+ }
+ return null;
}
/**