tracker完成
Change-Id: Ib69b662cfd24a8a5c7f3a29e6e5b6baa25611e57
diff --git a/src/main/java/com/example/g8backend/controller/TrackerController.java b/src/main/java/com/example/g8backend/controller/TrackerController.java
index ace7067..9e567a6 100644
--- a/src/main/java/com/example/g8backend/controller/TrackerController.java
+++ b/src/main/java/com/example/g8backend/controller/TrackerController.java
@@ -11,6 +11,13 @@
import org.springframework.web.bind.annotation.*;
import com.example.g8backend.service.ITrackerService;
+import java.io.UnsupportedEncodingException;
+import java.net.URLDecoder;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
@RestController
@RequestMapping("/tracker")
public class TrackerController {
@@ -19,9 +26,29 @@
@Autowired
private ITrackerService trackerService;
+ private String getInfoHash(String queryStr) throws UnsupportedEncodingException {
+ Pattern INFO_HASH = Pattern.compile("info_hash=([^&]+)");
+ Matcher matcher = INFO_HASH.matcher(queryStr);
+ StringBuilder hexString = new StringBuilder();
+ if (matcher.find()) {
+ String matchedHash = matcher.group(1);
+ String decodeInfoHash = URLDecoder.decode(matchedHash, "ISO-8859-1");
+ byte[] infoHashBytes = decodeInfoHash.getBytes("ISO-8859-1");
+ for (byte b : infoHashBytes) {
+ String hex = Integer.toHexString(b & 0xFF);
+ if (hex.length() == 1) {
+ hexString.append('0');
+ }
+ hexString.append(hex);
+ }
+ return hexString.toString();
+ } else {
+ return null;
+ }
+ }
@GetMapping(value = "/announce/{passkey}", produces = "application/x-bittorrent")
- public ResponseEntity<byte[]> getAnnouncements(
+ public ResponseEntity<String> getAnnouncements(
HttpServletRequest request,
@RequestParam("info_hash") String infoHash,
@RequestParam("peer_id") String peerId,
@@ -31,14 +58,15 @@
@RequestParam(value = "event", required = false) String event,
@RequestParam(value = "left", required = false) Double left,
@RequestParam(value = "compact", required = false) Integer compact,
- @PathVariable String passkey) {
+ @PathVariable String passkey) throws UnsupportedEncodingException {
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);
-
+ String url = request.getQueryString();
AnnounceRequestDTO requestDTO = new AnnounceRequestDTO();
requestDTO.setPasskey(passkey);
- requestDTO.setInfoHash(infoHash);
+ logger.info("Passkey:{}", getInfoHash(url));
+ requestDTO.setInfoHash(getInfoHash(url));
requestDTO.setPeerId(peerId);
requestDTO.setPort(port);
requestDTO.setUploaded(uploaded);
@@ -51,12 +79,14 @@
requestDTO.setIp(ipAddress);
AnnounceResponseDTO responseDTO = trackerService.handleAnnounce(requestDTO);
-
- byte[] bencoded = BencodeUtil.encodeAnnounceResponse(responseDTO);
+ Map<String, Object> response = new HashMap<>();
+ response.put("interval", responseDTO.getInterval());
+ response.put("peers", responseDTO.getPeers());
+ String bencodeResponse = BencodeUtil.encodeISO(response);
return ResponseEntity
.ok()
.header("Content-Type", "application/x-bittorrent")
- .body(bencoded);
+ .body(bencodeResponse);
}
/**