blob: ace7067bbf4ad60debd058c29b7bd23b46a9349d [file] [log] [blame]
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);
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();
}
}