blob: f2a75e3884ab515f95ee2d6d4c3024264457ff33 [file] [log] [blame]
package com.pt.controller;
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.IOException;
import java.util.HashMap;
import java.util.Map;
@RestController
@RequestMapping("/api/tracker")
@CrossOrigin(origins = "*")
public class TrackerController {
@Autowired
private TrackerService trackerService;
// tracker相应bt客户端的announce请求
@PostMapping("/announce")
public void announceByPost(
@RequestBody Map<String, String> body,
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"));
String ip = request.getRemoteAddr();
// 将参数封装为 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);
response.setContentType("application/x-bittorrent");
response.getOutputStream().write(bencodedResponse);
} catch (Exception e) {
response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
response.setContentType("text/plain");
response.getWriter().write("Tracker internal error: " + e.getMessage());
}
}
}