user冲突, pt/bt交互(待完善版)
Change-Id: I7530921962ac82ad1a896ae3c120416256f787e0
diff --git a/src/main/java/com/example/myproject/controller/TrackerController.java b/src/main/java/com/example/myproject/controller/TrackerController.java
new file mode 100644
index 0000000..204b3b9
--- /dev/null
+++ b/src/main/java/com/example/myproject/controller/TrackerController.java
@@ -0,0 +1,87 @@
+package com.example.myproject.controller;
+
+import cn.hutool.core.util.HexUtil;
+
+import com.example.myproject.dto.param.AnnounceRequest;
+//import com.example.myproject.service.AnnounceService;
+//import com.example.myproject.utils.BinaryFieldUtil;
+import com.turn.ttorrent.bcodec.BEncoder;
+//import com.example.myproject.utils.IPUtils;
+
+
+
+
+import javax.servlet.http.HttpServletRequest;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.client.RestTemplate;
+
+import java.nio.ByteBuffer;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+
+@Slf4j
+@RestController
+@RequiredArgsConstructor
+public class TrackerController {
+
+// private final AnnounceService announceService;
+
+ private final RestTemplate restTemplate = new RestTemplate();
+
+ @GetMapping("/announce")
+ public ResponseEntity<byte[]> announce(HttpServletRequest request,
+ @ModelAttribute AnnounceRequest announceRequest,
+ @RequestHeader(name = "User-Agent") String ua,
+ @RequestHeader(name = "want-digest", required = false) String wantDigest) {
+
+ // 1. 获取请求参数原始字符串(方便解析peerId、infoHash等)
+ String queryStrings = request.getQueryString();
+ log.info("收到announce汇报:" + queryStrings);
+ //收到announce汇报:passkey=1&info_hash=%c8%8e%8ak8%09%97%1b%ab4%3a%a2%c3%bf%c3%22%05%f2j%d1&peer_id=-qB453A-9nl.HBf73dry&port=62128&uploaded=0&downloaded=0&left=1711543&corrupt=0&key=A0B2541D&event=started&numwant=200&compact=1&no_peer_id=1&supportcrypto=1&redundant=0
+ //
+ // 2. 获取客户端IP
+ // 3. 提取peerId和infoHash(二进制字段)
+// byte[] peerId = BinaryFieldUtil.matchPeerId(queryStrings);
+// String peerIdHex = HexUtil.encodeHexStr(peerId);
+// byte[] infoHash = BinaryFieldUtil.matchInfoHash(queryStrings);
+
+// log.info("peerid:" + peerId);
+// log.info("infohash" + infoHash);
+
+// String ipAddr = IPUtils.getIpAddr();
+//
+//
+//
+// // 4. 设置AnnounceRequest其他字段
+// announceRequest.setSeeder(announceRequest.getLeft() != null && announceRequest.getLeft().equals(0L));
+// announceRequest.setInfoHash(infoHash);
+// announceRequest.setPeerId(peerId);
+// announceRequest.setPeerIdHex(peerIdHex);
+// announceRequest.setRemoteAddr(ipAddr);
+// announceRequest.setWantDigest(wantDigest);
+// announceRequest.setUserAgent(ua);
+
+// // 5. 先调用业务层处理,比如记录用户状态
+// announceService.announce(announceRequest);
+
+ // 6. 转发请求到真正tracker(6969端口)
+
+ // 构造转发URL
+ String trackerUrl = "http://localhost:6969/announce" + (queryStrings != null ? "?" + queryStrings : "");
+
+ // 使用RestTemplate发起GET请求,直接获取二进制响应(bencode)
+ ResponseEntity<byte[]> trackerResponse = restTemplate.getForEntity(trackerUrl, byte[].class);
+
+ // 7. 直接将tracker返回的二进制数据,作为响应返回给客户端
+ return ResponseEntity.ok()
+ .header("Content-Type", "text/plain") // bencode通常用text/plain,或者 application/x-bittorrent
+ .body(trackerResponse.getBody());
+
+ }
+}
+