blob: 84c04ba2b2bad397c3d145a76d83a88ea8c6ec7d [file] [log] [blame]
wuchimedes223bfab2025-04-04 17:16:05 +08001package com.example.g8backend.controller;
2
wuchimedesdb9fe682025-04-22 19:24:11 +08003import com.example.g8backend.dto.AnnounceRequestDTO;
4import com.example.g8backend.dto.AnnounceResponseDTO;
2230107166504b72025-06-08 13:54:29 +08005import com.example.g8backend.util.BencodeUtil;
wuchimedesdb9fe682025-04-22 19:24:11 +08006import jakarta.servlet.http.HttpServletRequest;
22301071f1381f82025-06-06 21:32:34 +08007import org.slf4j.Logger;
8import org.slf4j.LoggerFactory;
wuchimedes223bfab2025-04-04 17:16:05 +08009import org.springframework.beans.factory.annotation.Autowired;
10import org.springframework.http.ResponseEntity;
wuchimedesa0649c62025-04-05 15:53:39 +080011import org.springframework.web.bind.annotation.*;
wuchimedes223bfab2025-04-04 17:16:05 +080012import com.example.g8backend.service.ITrackerService;
13
14@RestController
wuchimedesa0649c62025-04-05 15:53:39 +080015@RequestMapping("/tracker")
wuchimedes223bfab2025-04-04 17:16:05 +080016public class TrackerController {
17
2230107166504b72025-06-08 13:54:29 +080018 private static final Logger logger = LoggerFactory.getLogger(TrackerController.class);
19
wuchimedesa0649c62025-04-05 15:53:39 +080020 @Autowired
21 private ITrackerService trackerService;
22
2230107166504b72025-06-08 13:54:29 +080023 @GetMapping(value = "/announce/{passkey}", produces = "application/x-bittorrent")
24 public ResponseEntity<byte[]> getAnnouncements(
wuchimedesdb9fe682025-04-22 19:24:11 +080025 HttpServletRequest request,
26 @RequestParam("info_hash") String infoHash,
27 @RequestParam("peer_id") String peerId,
28 @RequestParam("port") int port,
29 @RequestParam("uploaded") double uploaded,
30 @RequestParam("downloaded") double downloaded,
31 @RequestParam(value = "event", required = false) String event,
32 @RequestParam(value = "left", required = false) Double left,
33 @RequestParam(value = "compact", required = false) Integer compact,
wuchimedesa0649c62025-04-05 15:53:39 +080034 @PathVariable String passkey) {
35
2230107166504b72025-06-08 13:54:29 +080036 logger.info("Announce request received: info_hash={}, peer_id={}, port={}, uploaded={}, downloaded={}, event={}, left={}, compact={}, passkey={}",
37 infoHash, peerId, port, uploaded, downloaded, event, left, compact, passkey);
22301071f1381f82025-06-06 21:32:34 +080038
wuchimedesaa4baa52025-06-08 17:39:53 +080039 System.out.println("passkey: " + passkey);
40 System.out.println("info_hash: " + infoHash);
41
wuchimedesdb9fe682025-04-22 19:24:11 +080042 AnnounceRequestDTO requestDTO = new AnnounceRequestDTO();
43 requestDTO.setPasskey(passkey);
44 requestDTO.setInfoHash(infoHash);
45 requestDTO.setPeerId(peerId);
46 requestDTO.setPort(port);
47 requestDTO.setUploaded(uploaded);
48 requestDTO.setDownloaded(downloaded);
49 requestDTO.setEvent(event);
2230107166504b72025-06-08 13:54:29 +080050 requestDTO.setLeft(left != null ? left : 0.0);
wuchimedesdb9fe682025-04-22 19:24:11 +080051 requestDTO.setCompact(compact);
52
2230107166504b72025-06-08 13:54:29 +080053 String ipAddress = extractClientIp(request);
54 requestDTO.setIp(ipAddress);
22301071f1381f82025-06-06 21:32:34 +080055
2230107166504b72025-06-08 13:54:29 +080056 AnnounceResponseDTO responseDTO = trackerService.handleAnnounce(requestDTO);
57
58 byte[] bencoded = BencodeUtil.encodeAnnounceResponse(responseDTO);
59 return ResponseEntity
60 .ok()
61 .header("Content-Type", "application/x-bittorrent")
62 .body(bencoded);
63 }
64
65 /**
66 * 提取客户端 IP,支持 X-Forwarded-For
67 */
68 private String extractClientIp(HttpServletRequest request) {
69 String xfHeader = request.getHeader("X-Forwarded-For");
70 if (xfHeader != null && !xfHeader.isEmpty()) {
71 return xfHeader.split(",")[0].trim();
wuchimedesdb9fe682025-04-22 19:24:11 +080072 }
2230107166504b72025-06-08 13:54:29 +080073 return request.getRemoteAddr();
wuchimedesa0649c62025-04-05 15:53:39 +080074 }
wuchimedes223bfab2025-04-04 17:16:05 +080075}