更清晰的日志显示

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;
     }
 
     /**