| package com.example.g8backend.controller; |
| |
| import com.example.g8backend.dto.AnnounceRequestDTO; |
| import com.example.g8backend.dto.AnnounceResponseDTO; |
| import com.example.g8backend.util.BencodeUtil; |
| import jakarta.servlet.http.HttpServletRequest; |
| import org.slf4j.Logger; |
| import org.slf4j.LoggerFactory; |
| import org.springframework.beans.factory.annotation.Autowired; |
| import org.springframework.http.ResponseEntity; |
| import org.springframework.web.bind.annotation.*; |
| import com.example.g8backend.service.ITrackerService; |
| |
| @RestController |
| @RequestMapping("/tracker") |
| public class TrackerController { |
| |
| private static final Logger logger = LoggerFactory.getLogger(TrackerController.class); |
| |
| @Autowired |
| private ITrackerService trackerService; |
| |
| @GetMapping(value = "/announce/{passkey}", produces = "application/x-bittorrent") |
| public ResponseEntity<byte[]> getAnnouncements( |
| HttpServletRequest request, |
| @RequestParam("info_hash") String infoHash, |
| @RequestParam("peer_id") String peerId, |
| @RequestParam("port") int port, |
| @RequestParam("uploaded") double uploaded, |
| @RequestParam("downloaded") double downloaded, |
| @RequestParam(value = "event", required = false) String event, |
| @RequestParam(value = "left", required = false) Double left, |
| @RequestParam(value = "compact", required = false) Integer compact, |
| @PathVariable String passkey) { |
| |
| logger.info("Announce request received: info_hash={}, peer_id={}, port={}, uploaded={}, downloaded={}, event={}, left={}, compact={}, passkey={}", |
| infoHash, peerId, port, uploaded, downloaded, event, left, compact, passkey); |
| |
| System.out.println("passkey: " + passkey); |
| System.out.println("info_hash: " + infoHash); |
| |
| AnnounceRequestDTO requestDTO = new AnnounceRequestDTO(); |
| requestDTO.setPasskey(passkey); |
| requestDTO.setInfoHash(infoHash); |
| requestDTO.setPeerId(peerId); |
| requestDTO.setPort(port); |
| requestDTO.setUploaded(uploaded); |
| requestDTO.setDownloaded(downloaded); |
| requestDTO.setEvent(event); |
| requestDTO.setLeft(left != null ? left : 0.0); |
| requestDTO.setCompact(compact); |
| |
| String ipAddress = extractClientIp(request); |
| requestDTO.setIp(ipAddress); |
| |
| AnnounceResponseDTO responseDTO = trackerService.handleAnnounce(requestDTO); |
| |
| byte[] bencoded = BencodeUtil.encodeAnnounceResponse(responseDTO); |
| return ResponseEntity |
| .ok() |
| .header("Content-Type", "application/x-bittorrent") |
| .body(bencoded); |
| } |
| |
| /** |
| * 提取客户端 IP,支持 X-Forwarded-For |
| */ |
| private String extractClientIp(HttpServletRequest request) { |
| String xfHeader = request.getHeader("X-Forwarded-For"); |
| if (xfHeader != null && !xfHeader.isEmpty()) { |
| return xfHeader.split(",")[0].trim(); |
| } |
| return request.getRemoteAddr(); |
| } |
| } |