blob: f2a75e3884ab515f95ee2d6d4c3024264457ff33 [file] [log] [blame]
Edwardsamaxlf1bf7ad2025-06-03 23:52:16 +08001package com.pt.controller;
2
3import com.pt.service.TrackerService;
4import jakarta.servlet.http.HttpServletRequest;
5import jakarta.servlet.http.HttpServletResponse;
6import org.springframework.beans.factory.annotation.Autowired;
7import org.springframework.web.bind.annotation.*;
8
9import java.io.IOException;
22301102ca0fb2f2025-06-09 18:40:42 +080010import java.util.HashMap;
Edwardsamaxlf1bf7ad2025-06-03 23:52:16 +080011import java.util.Map;
12
13@RestController
2230110272bc8d02025-06-07 10:53:27 +080014@RequestMapping("/api/tracker")
22301102ca0fb2f2025-06-09 18:40:42 +080015@CrossOrigin(origins = "*")
Edwardsamaxlf1bf7ad2025-06-03 23:52:16 +080016public class TrackerController {
17
18 @Autowired
19 private TrackerService trackerService;
20
22301102ca0fb2f2025-06-09 18:40:42 +080021 // tracker相应bt客户端的announce请求
22 @PostMapping("/announce")
23 public void announceByPost(
Edwardsamaxlaf825a22025-06-09 21:17:29 +080024 @RequestBody Map<String, String> body,
22301102ca0fb2f2025-06-09 18:40:42 +080025 HttpServletRequest request,
26 HttpServletResponse response
27 ) throws IOException {
Edwardsamaxlf1bf7ad2025-06-03 23:52:16 +080028 try {
Edwardsamaxlaf825a22025-06-09 21:17:29 +080029
30 String infoHash = body.get("info_hash");
31 String peerId = body.get("peer_id");
32 int port = Integer.parseInt(body.get("port"));
33
Edwardsamaxlf1bf7ad2025-06-03 23:52:16 +080034 String ip = request.getRemoteAddr();
Edwardsamaxlf1bf7ad2025-06-03 23:52:16 +080035
22301102ca0fb2f2025-06-09 18:40:42 +080036 // 将参数封装为 Map 传给服务层(也可以直接传对象)
37 Map<String, String[]> params = new HashMap<>();
38 params.put("info_hash", new String[]{infoHash});
39 params.put("peer_id", new String[]{peerId});
40 params.put("port", new String[]{String.valueOf(port)});
Edwardsamaxlf1bf7ad2025-06-03 23:52:16 +080041 byte[] bencodedResponse = trackerService.handleAnnounce(params, ip);
42
43 response.setContentType("application/x-bittorrent");
44 response.getOutputStream().write(bencodedResponse);
45 } catch (Exception e) {
46 response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
47 response.setContentType("text/plain");
48 response.getWriter().write("Tracker internal error: " + e.getMessage());
49 }
50 }
51
52}
53