修改Tracker服务器相关bug

Change-Id: Id3ec61034575bd794724be98f832f8c065448b92
diff --git a/src/main/java/com/pt/controller/TrackerController.java b/src/main/java/com/pt/controller/TrackerController.java
index f2a75e3..b670f3f 100644
--- a/src/main/java/com/pt/controller/TrackerController.java
+++ b/src/main/java/com/pt/controller/TrackerController.java
@@ -1,12 +1,17 @@
 package com.pt.controller;
 
+import com.pt.service.TorrentMetaService;
 import com.pt.service.TrackerService;
 import jakarta.servlet.http.HttpServletRequest;
 import jakarta.servlet.http.HttpServletResponse;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
+import java.io.FileInputStream;
 import java.io.IOException;
+import java.net.URLDecoder;
+import java.nio.charset.StandardCharsets;
+import java.security.MessageDigest;
 import java.util.HashMap;
 import java.util.Map;
 
@@ -18,36 +23,79 @@
     @Autowired
     private TrackerService trackerService;
 
+    @Autowired
+    private TorrentMetaService torrentMetaService;
+
     // tracker相应bt客户端的announce请求
-    @PostMapping("/announce")
-    public void announceByPost(
-            @RequestBody Map<String, String> body,
+    @GetMapping("/announce")
+    public void announce(
+            @RequestParam(value = "passkey", required = false) String passkey,
+            @RequestParam(value = "info_hash") String encodedInfoHash,
+            @RequestParam(value = "peer_id") String encodedPeerId,
+            @RequestParam(value = "port") int port,
+            @RequestParam(value = "uploaded") long uploaded,
+            @RequestParam(value = "downloaded") long downloaded,
+            @RequestParam(value = "left") long left,
+            @RequestParam(value = "event", defaultValue = "") String event,
+            @RequestParam(value = "compact", defaultValue = "1") int compact,
+            @RequestParam(value = "numwant", defaultValue = "50") int numwant,
             HttpServletRequest request,
             HttpServletResponse response
     ) throws IOException {
         try {
 
-            String infoHash = body.get("info_hash");
-            String peerId = body.get("peer_id");
-            int port = Integer.parseInt(body.get("port"));
+            System.out.println("TrackerController------------------------announce");
+            // 解码 info_hash 和 peer_id(从URL编码的字符串转为字节数组)
+            System.out.println("TrackerController------------------------announce: info_hash=" + encodedInfoHash + ", peer_id=" + encodedPeerId);
+            String decodedInfoHash = URLDecoder.decode(encodedInfoHash, StandardCharsets.ISO_8859_1);
+            String decodedPeerId = URLDecoder.decode(encodedPeerId, StandardCharsets.ISO_8859_1);
 
+            // 转换为字节数组
+            byte[] infoHashBytes = decodedInfoHash.getBytes(StandardCharsets.ISO_8859_1);
+            byte[] peerIdBytes = decodedPeerId.getBytes(StandardCharsets.ISO_8859_1);
+
+            // 验证 info_hash 长度
+//            if (infoHashBytes.length != 20) {
+//                throw new IllegalArgumentException("Invalid info_hash length");
+//            }
+
+            // 获取客户端IP
             String ip = request.getRemoteAddr();
+            System.out.println("Client IP: " + ip);
 
-            // 将参数封装为 Map 传给服务层(也可以直接传对象)
-            Map<String, String[]> params = new HashMap<>();
-            params.put("info_hash", new String[]{infoHash});
-            params.put("peer_id", new String[]{peerId});
-            params.put("port", new String[]{String.valueOf(port)});
-            byte[] bencodedResponse = trackerService.handleAnnounce(params, ip);
+            // 将参数封装为 Map 传给服务层
+            Map<String, Object> params = new HashMap<>();
+            params.put("info_hash", decodedInfoHash);
+            params.put("peer_id", decodedPeerId);
+            params.put("port", port);
+            params.put("uploaded", uploaded);
+            params.put("downloaded", downloaded);
+            params.put("left", left);
+            params.put("event", event);
+            params.put("compact", compact);
+            params.put("numwant", numwant);
+            params.put("ip", ip);
+            params.put("passkey", passkey);
 
+            byte[] bencodedResponse = trackerService.handleAnnounce(params, ip, event);
             response.setContentType("application/x-bittorrent");
             response.getOutputStream().write(bencodedResponse);
+
+        } catch (IllegalArgumentException e) {
+            System.out.println("TrackerService-----------------------Error processing announce request111: " + e.getMessage());
+            e.printStackTrace();
+            String errorResponse = "d14:failure reason" + e.getMessage().length() + ":" + e.getMessage() + "e";
+            response.setContentType("application/x-bittorrent");
+            response.getOutputStream().write(errorResponse.getBytes(StandardCharsets.ISO_8859_1));
         } catch (Exception e) {
-            response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
-            response.setContentType("text/plain");
-            response.getWriter().write("Tracker internal error: " + e.getMessage());
+            e.printStackTrace();
+            System.out.println("TrackerService-----------------------Error processing announce request222: " + e.getMessage());
+            String errorResponse = "d14:failure reason20:Internal server errore";
+            response.setContentType("application/x-bittorrent");
+            response.getOutputStream().write(errorResponse.getBytes(StandardCharsets.ISO_8859_1));
         }
     }
 
+
 }