You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

667 lines
20 KiB

3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
  1. use async_std::net::{SocketAddr, ToSocketAddrs, UdpSocket, TcpStream};
  2. use async_std::prelude::*;
  3. use async_std::io;
  4. use async_std::task::spawn;
  5. // use std::io::prelude::*;
  6. // use std::net::TcpStream;
  7. use std::error::Error;
  8. use std::net::Ipv4Addr;
  9. use std::convert::TryInto;
  10. use std::str;
  11. use byteorder::{BigEndian, ByteOrder};
  12. use rand::Rng;
  13. use sha1::{Sha1, Digest};
  14. extern crate serde;
  15. extern crate serde_bencode;
  16. #[macro_use]
  17. extern crate serde_derive;
  18. extern crate serde_bytes;
  19. use serde_bencode::{de, ser};
  20. use serde_bytes::ByteBuf;
  21. // use rustc_hex::ToHex;
  22. const CONNECT_MSG: u32 = 0;
  23. const ANNOUNCE_MSG: u32 = 1;
  24. const BLOCK_LEN: u32 = 16384; // 2**14
  25. #[derive(Debug, Deserialize)]
  26. struct Node(String, i64);
  27. #[derive(Debug, Serialize, Deserialize)]
  28. struct File {
  29. path: Vec<String>,
  30. length: i64,
  31. #[serde(default)]
  32. md5sum: Option<String>,
  33. }
  34. #[derive(Debug, Serialize, Deserialize)]
  35. struct Info {
  36. name: String,
  37. pieces: ByteBuf,
  38. #[serde(rename = "piece length")]
  39. piece_length: i64,
  40. #[serde(default)]
  41. md5sum: Option<String>,
  42. #[serde(default)]
  43. length: Option<i64>,
  44. #[serde(default)]
  45. files: Option<Vec<File>>,
  46. #[serde(default)]
  47. private: Option<u8>,
  48. #[serde(default)]
  49. path: Option<Vec<String>>,
  50. #[serde(default)]
  51. #[serde(rename = "root hash")]
  52. root_hash: Option<String>,
  53. }
  54. #[derive(Debug, Deserialize)]
  55. struct Torrent {
  56. info: Info,
  57. #[serde(default)]
  58. announce: Option<String>,
  59. #[serde(default)]
  60. nodes: Option<Vec<Node>>,
  61. #[serde(default)]
  62. encoding: Option<String>,
  63. #[serde(default)]
  64. httpseeds: Option<Vec<String>>,
  65. #[serde(default)]
  66. #[serde(rename = "announce-list")]
  67. announce_list: Option<Vec<Vec<String>>>,
  68. #[serde(default)]
  69. #[serde(rename = "creation date")]
  70. creation_date: Option<i64>,
  71. #[serde(rename = "comment")]
  72. comment: Option<String>,
  73. #[serde(default)]
  74. #[serde(rename = "created by")]
  75. created_by: Option<String>,
  76. }
  77. impl Torrent {
  78. pub fn open(path: &str) -> Torrent {
  79. let b = std::fs::read(path).unwrap();
  80. de::from_bytes::<Torrent>(&b).unwrap()
  81. }
  82. pub fn size(&self) -> u64 {
  83. let files = self.info.files.as_ref().unwrap();
  84. let mut size: u64 = 0;
  85. for i in 0..files.len() {
  86. size = size + files[i].length as u64;
  87. }
  88. size
  89. }
  90. pub fn info_hash(&self) -> Vec<u8> {
  91. let info_bytes: Vec<u8> = ser::to_bytes(&self.info).unwrap();
  92. let mut hasher = Sha1::new();
  93. hasher.update(info_bytes);
  94. let result = hasher.finalize();
  95. result.to_vec()
  96. }
  97. pub fn piece_len(&self, piece_index: u32) -> u32 {
  98. let total_len = self.size() as u32;
  99. let piece_len = self.info.piece_length as u32;
  100. let last_piece_len = total_len % piece_len;
  101. let last_piece_index = ((total_len / piece_len) as f32).floor() as u32;
  102. if last_piece_index == piece_index {
  103. return last_piece_len;
  104. }
  105. piece_len
  106. }
  107. pub fn blocks_per_piece(&self, piece_index: u32) -> u32 {
  108. let piece_len = self.piece_len(piece_index);
  109. ((piece_len as u32 / BLOCK_LEN) as f32).floor() as u32
  110. }
  111. pub fn block_len(&self, piece_index: u32, block_index: u32) -> u32 {
  112. let piece_len = self.piece_len(piece_index);
  113. let last_piece_len = piece_len % BLOCK_LEN;
  114. let last_piece_index = ((piece_len / BLOCK_LEN) as f32).floor() as u32;
  115. if block_index==last_piece_index {
  116. return last_piece_len;
  117. }
  118. BLOCK_LEN
  119. }
  120. pub fn announce(&self) -> Option<String> {
  121. let mut a: String = "".to_string();
  122. match &self.announce {
  123. Some(s) => {
  124. a = s.to_string();
  125. }
  126. _ => (),
  127. };
  128. match &self.announce_list { // TODO refactor approach
  129. Some(list) => {
  130. a = list[0][0].clone();
  131. }
  132. _ => (),
  133. };
  134. Some(a)
  135. }
  136. pub fn protocol(&self) -> Option<String> {
  137. let announce = &self.announce().unwrap();
  138. let aux: Vec<&str> = announce.split(":").collect();
  139. let protocol = aux[0];
  140. Some(protocol.to_string())
  141. }
  142. pub async fn get_peers(&self) -> Result<Vec<Peer>, Box<dyn Error>> {
  143. // TODO timming system to resend request if no answer in X seconds
  144. if self.protocol().unwrap() != "udp" {
  145. panic!("not udp: {:?}", self.protocol().unwrap()); // TODO remove panic, return error
  146. }
  147. let peer = self.announce.clone().unwrap().replace("udp://", "");
  148. println!("peer {:?}", peer);
  149. let socket = UdpSocket::bind("0.0.0.0:6681").await?;
  150. let conn_req = msg_conn_req().to_vec();
  151. println!("SENDING conn_req {:?}", conn_req);
  152. socket.send_to(&conn_req, &peer).await?;
  153. let mut buf = vec![0u8; 1024];
  154. let peers = loop {
  155. let (n, src) = socket.recv_from(&mut buf).await?;
  156. let typ = msg_resp_type(&buf);
  157. if typ == CONNECT_MSG {
  158. println!("TYPE: CONNECT: {:?}", CONNECT_MSG);
  159. // println!("HEX {:?}", &buf[0..n].to_hex());
  160. let conn_resp = msg_parse_connect_resp(&buf[0..n].to_vec());
  161. let announce_req = msg_ann_req(conn_resp.connection_id, self, 6681);
  162. socket.send_to(&announce_req[..], &src).await?;
  163. } else if typ==ANNOUNCE_MSG {
  164. println!("TYPE: ANNOUNCE: {:?}", ANNOUNCE_MSG);
  165. // println!("HEX {:?}", &buf[0..n].to_hex());
  166. let ann_resp = msg_parse_announce_resp(&buf[0..n].to_vec());
  167. break ann_resp.peers;
  168. }
  169. };
  170. Ok(peers)
  171. }
  172. }
  173. struct Block {
  174. length: u32,
  175. bytes: Vec<u8>,
  176. }
  177. struct Payload {
  178. index: u32,
  179. begin: u32,
  180. length: u32,
  181. block: Block,
  182. }
  183. struct Msg {
  184. size: u32,
  185. id: u8,
  186. payload: Payload,
  187. }
  188. fn msg_parse(b: Vec<u8>) -> Result<Msg, &'static str> {
  189. if b.len()<4 {
  190. return Err("No id in msg.");
  191. }
  192. let id = b[4];
  193. if b.len()<5 {
  194. return Err("No payload in msg.");
  195. }
  196. let mut payload: Payload = Payload{
  197. index: 0,
  198. begin: 0,
  199. length: 0,
  200. block: Block{
  201. length: 0,
  202. bytes: Vec::new()
  203. }
  204. };
  205. match id {
  206. 6 | 7 | 8 => {
  207. payload.index = BigEndian::read_u32(&b[5..9]);
  208. payload.begin = BigEndian::read_u32(&b[9..13]);
  209. if id==7 {
  210. payload.length = BigEndian::read_u32(&b[13..]);
  211. }
  212. }
  213. _ => ()
  214. };
  215. Ok(Msg{
  216. size: BigEndian::read_u32(&b[0..4]),
  217. id: id,
  218. payload: payload,
  219. })
  220. }
  221. async fn msg_handler<'a>(
  222. b: Vec<u8>,
  223. mut stream: TcpStream,
  224. torrent: &Torrent,
  225. pieces: &mut Pieces,
  226. queue: &mut Queue<'a>,
  227. file: String,
  228. ) -> Result<(), Box<dyn Error>> {
  229. if is_handshake(&b) {
  230. stream.write(&msg_interested()).await?;
  231. println!("IS HANDSHAKE");
  232. return Ok(())
  233. }
  234. let m = msg_parse(b).unwrap();
  235. match m.id {
  236. 0 => handler_choke(stream),
  237. 1 => handler_unchoke(stream, pieces, queue),
  238. 4 => handler_have(stream, pieces, queue, m.payload),
  239. 5 => handler_bitfield(stream, pieces, queue, m.payload),
  240. 7 => handler_piece(stream, pieces, queue, torrent, file, m.payload),
  241. _ => {},
  242. }
  243. Ok(())
  244. }
  245. fn is_handshake(b: &Vec<u8>) -> bool {
  246. b.len()==(b[0] as usize) +49 && b.len()==68 && &b[1..20] == b"BitTorrent protocol"
  247. }
  248. fn handler_choke(mut stream: TcpStream) {
  249. // stream.shutdown()
  250. }
  251. fn handler_unchoke(mut stream: TcpStream, pieces: &mut Pieces, queue: &mut Queue) {
  252. queue.chocked = false;
  253. request_piece(stream, pieces, queue);
  254. }
  255. fn handler_have(mut stream: TcpStream, pieces: &mut Pieces, queue: &mut Queue, payload: Payload) {
  256. }
  257. fn handler_bitfield(mut stream: TcpStream, pieces: &mut Pieces, queue: &mut Queue, payload: Payload) {
  258. }
  259. fn handler_piece(mut stream: TcpStream, pieces: &mut Pieces, queue: &mut Queue, torrent: &Torrent, file: String, payload: Payload) {
  260. }
  261. async fn request_piece<'a>(mut stream: TcpStream, pieces: &mut Pieces, queue: &mut Queue<'a>) -> Result<(), Box<dyn Error>> {
  262. if queue.chocked {
  263. // return
  264. }
  265. while queue.length()>0 {
  266. let piece_block = queue.get_last();
  267. if pieces.needed(&piece_block) {
  268. stream.write(&msg_request(&piece_block)).await?;
  269. pieces.add_requested(&piece_block);
  270. break;
  271. }
  272. };
  273. Ok(())
  274. }
  275. fn msg_conn_req() -> [u8; 16] {
  276. let mut b: [u8; 16] = [0; 16];
  277. BigEndian::write_u64(&mut b[0..8], 0x41727101980); // connection_id
  278. let random_bytes = rand::thread_rng().gen::<[u8; 4]>();
  279. b[12..16].clone_from_slice(&random_bytes[..]);
  280. b
  281. }
  282. fn msg_ann_req(connection_id: u64, torrent: &Torrent, port: u16) -> Vec<u8> {
  283. let mut b: [u8; 98] = [0; 98];
  284. BigEndian::write_u64(&mut b[0..8], connection_id);
  285. BigEndian::write_u32(&mut b[8..12], ANNOUNCE_MSG); // action
  286. let random_bytes = rand::thread_rng().gen::<[u8; 4]>();
  287. b[12..16].clone_from_slice(&random_bytes[..]);
  288. b[16..36].clone_from_slice(&torrent.info_hash());
  289. println!("info_hash: {:?}", &b[16..36]);
  290. // TODO [36..56] peerId b[36..56].clone_from_slice("todo".as_bytes());
  291. // TODO [56..64] downloaded
  292. println!("torrent.size(): {:?}", torrent.size());
  293. BigEndian::write_u64(&mut b[64..72], torrent.size()); // [64..72] left
  294. // TODO [72..80] uploaded
  295. // TODO [80..84] event (0:none, 1:completed, 2:started, 3:stopped)
  296. // TODO [84..88] ip address
  297. let random_bytes = rand::thread_rng().gen::<[u8; 4]>();
  298. b[88..92].clone_from_slice(&random_bytes[..]); // [88..92] key (random)
  299. BigEndian::write_i32(&mut b[92..96], -1); // [92..96] num_want (default: -1)
  300. BigEndian::write_u16(&mut b[96..98], port); // [96..98] port
  301. b.to_vec()
  302. }
  303. fn msg_resp_type(b: &Vec<u8>) -> u32 {
  304. let action = BigEndian::read_u32(&b[0..4]);
  305. if action == 0 {
  306. return CONNECT_MSG;
  307. } else {
  308. return ANNOUNCE_MSG;
  309. }
  310. }
  311. #[derive(Debug)]
  312. struct ConnResp {
  313. action: u32,
  314. transaction_id: u32,
  315. connection_id: u64,
  316. }
  317. fn msg_parse_connect_resp(b: &Vec<u8>) -> ConnResp {
  318. ConnResp {
  319. action: BigEndian::read_u32(&b[0..4]),
  320. transaction_id: BigEndian::read_u32(&b[4..8]),
  321. connection_id: BigEndian::read_u64(&b[8..]),
  322. }
  323. }
  324. #[derive(Debug)]
  325. struct Peer {
  326. ip: String,
  327. port: u16,
  328. }
  329. #[derive(Debug)]
  330. struct AnnResp {
  331. action: u32,
  332. transaction_id: u32,
  333. interval: u32,
  334. leechers: u32,
  335. seeders: u32,
  336. peers: Vec<Peer>,
  337. }
  338. fn msg_parse_announce_resp(b: &Vec<u8>) -> AnnResp {
  339. let mut peers: Vec<Peer> = Vec::new();
  340. let n_peers = (b.len() - 20) / 6;
  341. for i in 0..n_peers {
  342. let peer: Peer = Peer {
  343. // ip: BigEndian::read_u32(&b[20+(6*i)..24+(6*i)]),
  344. ip: bytes_to_ip(
  345. &b[20 + (6 * i)..24 + (6 * i)]
  346. .try_into()
  347. .expect("err parsing peer ip"),
  348. ),
  349. port: BigEndian::read_u16(&b[24 + (6 * i)..26 + (6 * i)]),
  350. };
  351. peers.push(peer);
  352. }
  353. let ann_resp: AnnResp = AnnResp {
  354. action: BigEndian::read_u32(&b[0..4]),
  355. transaction_id: BigEndian::read_u32(&b[4..8]),
  356. interval: BigEndian::read_u32(&b[8..12]),
  357. leechers: BigEndian::read_u32(&b[12..16]),
  358. seeders: BigEndian::read_u32(&b[16..20]),
  359. peers: peers,
  360. };
  361. ann_resp
  362. }
  363. fn bytes_to_ip(b: &[u8; 4]) -> String {
  364. Ipv4Addr::new(b[0], b[1], b[2], b[3]).to_string()
  365. }
  366. fn msg_handshake(info_hash: Vec<u8>) -> Vec<u8> {
  367. let mut b: [u8; 68] = [0; 68];
  368. b[0] = 19;
  369. b[1..20].clone_from_slice(b"BitTorrent protocol"); // TODO use constant for the string
  370. b[28..48].clone_from_slice(&info_hash);
  371. b.to_vec()
  372. }
  373. fn msg_choke() -> Vec<u8> {
  374. let mut b: [u8; 5] = [0; 5];
  375. BigEndian::write_u32(&mut b[0..4], 1);
  376. b.to_vec()
  377. }
  378. fn msg_unchoke() -> Vec<u8> {
  379. let mut b: [u8; 5] = [0; 5];
  380. BigEndian::write_u32(&mut b[0..4], 1);
  381. b[4] = 1;
  382. b.to_vec()
  383. }
  384. fn msg_interested() -> Vec<u8> {
  385. let mut b: [u8; 5] = [0; 5];
  386. BigEndian::write_u32(&mut b[0..4], 1);
  387. b[4] = 2;
  388. b.to_vec()
  389. }
  390. fn msg_notinterested() -> Vec<u8> {
  391. let mut b: [u8; 5] = [0; 5];
  392. BigEndian::write_u32(&mut b[0..4], 1);
  393. b[4] = 3;
  394. b.to_vec()
  395. }
  396. fn msg_have(payload: Payload) -> Vec<u8> {
  397. let mut b: [u8; 9] = [0; 9];
  398. BigEndian::write_u32(&mut b[0..4], 5);
  399. b[4] = 4;
  400. BigEndian::write_u32(&mut b[5..9], payload.index); // TODO REVIEW CHECK payload.index
  401. b.to_vec()
  402. }
  403. fn msg_bitfield(bitfield: Vec<u8>) -> Vec<u8> {
  404. let mut b: [u8; 14] = [0; 14];
  405. BigEndian::write_u32(&mut b[0..4], bitfield.len() as u32);
  406. b[4] = 5;
  407. b[5..].clone_from_slice(&bitfield);
  408. b.to_vec()
  409. }
  410. fn msg_request(payload: &Payload) -> Vec<u8> {
  411. let mut b: [u8; 17] = [0; 17];
  412. BigEndian::write_u32(&mut b[0..4], 13);
  413. b[4] = 6;
  414. BigEndian::write_u32(&mut b[5..9], payload.index);
  415. BigEndian::write_u32(&mut b[9..13], payload.begin);
  416. BigEndian::write_u32(&mut b[13..17], payload.length);
  417. b.to_vec()
  418. }
  419. fn msg_piece(payload: Payload) -> Vec<u8> {
  420. let mut b: [u8; 13] = [0; 13]; // TODO payload.block.length
  421. BigEndian::write_u32(&mut b[0..4], payload.block.length+9);
  422. b[4] = 7;
  423. BigEndian::write_u32(&mut b[5..9], payload.index);
  424. BigEndian::write_u32(&mut b[9..13], payload.begin);
  425. b[13..].clone_from_slice(&payload.block.bytes);
  426. b.to_vec()
  427. }
  428. fn msg_cancel(payload: Payload) -> Vec<u8> {
  429. let mut b: [u8; 17] = [0; 17];
  430. BigEndian::write_u32(&mut b[0..4], 13);
  431. b[4] = 8;
  432. BigEndian::write_u32(&mut b[5..9], payload.index);
  433. BigEndian::write_u32(&mut b[9..13], payload.begin);
  434. BigEndian::write_u32(&mut b[13..17], payload.length);
  435. b.to_vec()
  436. }
  437. fn msg_port(port: u16) -> Vec<u8> {
  438. let mut b: [u8; 7] = [0; 7];
  439. BigEndian::write_u32(&mut b[0..4], 3);
  440. b[4] = 9;
  441. BigEndian::write_u16(&mut b[5..7], port);
  442. b.to_vec()
  443. }
  444. #[derive(Debug)]
  445. struct Pieces {
  446. requested: Vec<Vec<bool>>,
  447. received: Vec<Vec<bool>>,
  448. }
  449. impl Pieces {
  450. fn new(torrent: &Torrent) -> Pieces {
  451. let sub_requested: Vec<bool> = vec![false; torrent.info.pieces.len()/20];
  452. let sub_received: Vec<bool> = vec![false; torrent.info.pieces.len()/20];
  453. let requested: Vec<Vec<bool>> = vec![sub_requested; torrent.info.pieces.len()/20];
  454. let received: Vec<Vec<bool>> = vec![sub_received; torrent.info.pieces.len()/20];
  455. Pieces{
  456. requested: requested,
  457. received: received,
  458. }
  459. }
  460. fn add_requested(&mut self, block: &Payload) {
  461. let index = block.begin / BLOCK_LEN;
  462. self.requested[block.index as usize][index as usize] = true;
  463. }
  464. fn add_received(&mut self, block: &Payload) {
  465. let index = block.begin / BLOCK_LEN;
  466. self.requested[block.index as usize][index as usize] = true;
  467. }
  468. fn needed(&mut self, block: &Payload) -> bool {
  469. let mut n = 1;
  470. for i in 0..self.requested.len() {
  471. for j in 0..self.requested[i].len() {
  472. if self.requested[i][j] == false {
  473. n = n*0;
  474. }
  475. }
  476. }
  477. if n==1 {
  478. self.requested = self.received.clone();
  479. }
  480. let index = block.begin / BLOCK_LEN;
  481. !self.requested[block.index as usize][index as usize]
  482. }
  483. fn is_done(&self, ) -> bool {
  484. let mut n = 1;
  485. for i in 0..self.requested.len() {
  486. for j in 0..self.requested[i].len() {
  487. if self.requested[i][j] == false {
  488. n = n*0;
  489. }
  490. }
  491. }
  492. if n==1 {
  493. return true;
  494. }
  495. false
  496. }
  497. fn print_percent_done(&self, ) {
  498. }
  499. }
  500. struct Queue<'a>{
  501. torrent: &'a Torrent,
  502. queue: Vec<Payload>,
  503. chocked: bool,
  504. }
  505. impl<'a> Queue<'a> {
  506. fn new(torrent: &Torrent) -> Queue {
  507. Queue{
  508. torrent: torrent,
  509. queue: Vec::new(),
  510. chocked: true,
  511. }
  512. }
  513. fn queue(&mut self, index: u32) {
  514. let n_blocks = self.torrent.blocks_per_piece(index);
  515. for i in 0..n_blocks {
  516. let piece_block: Payload = Payload{
  517. index: index,
  518. begin: i*BLOCK_LEN,
  519. length: self.torrent.block_len(index, i),
  520. block: Block{
  521. length: 0,
  522. bytes: Vec::new(),
  523. }
  524. };
  525. self.queue.push(piece_block);
  526. }
  527. }
  528. fn get_last(&mut self) -> Payload {
  529. self.queue.remove(self.queue.len())
  530. }
  531. fn peek(&self) -> &Payload {
  532. &self.queue[0]
  533. }
  534. fn length(&self) -> usize {
  535. self.queue.len()
  536. }
  537. }
  538. #[cfg(test)]
  539. mod tests {
  540. use super::*;
  541. use rustc_hex::ToHex;
  542. #[test]
  543. fn torrent_structs() {
  544. let t = Torrent::open("test.torrent");
  545. assert_eq!(t.info.name, "Big Buck Bunny");
  546. assert_eq!(t.announce().unwrap(), "udp://tracker.leechers-paradise.org:6969");
  547. assert_eq!(t.info_hash().to_hex(), "dd8255ecdc7ca55fb0bbf81323d87062db1f6d1c");
  548. assert_eq!(t.size(), 276_445_467);
  549. }
  550. #[test]
  551. fn msgs() {
  552. let t = Torrent::open("test.torrent");
  553. let conn_req = msg_conn_req().to_vec();
  554. assert_eq!(conn_req[0..12].to_hex(), "000004172710198000000000"); // [12..16] is random
  555. let conn_resp_buf = b"00000000d4c575c2c078f9a83418bebc";
  556. let conn_resp = msg_parse_connect_resp(&conn_resp_buf.to_vec());
  557. println!("conn_resp {:?}", conn_resp);
  558. assert_eq!(conn_resp.action, 808464432);
  559. assert_eq!(conn_resp.transaction_id, 808464432);
  560. assert_eq!(conn_resp.connection_id, 7220505182792409906);
  561. let announce_req = msg_ann_req(conn_resp.connection_id, &t, 6681);
  562. assert_eq!(announce_req[0..12].to_hex(), "643463353735633200000001");
  563. assert_eq!(announce_req[16..72].to_hex(), "dd8255ecdc7ca55fb0bbf81323d87062db1f6d1c0000000000000000000000000000000000000000000000000000000000000000107a391b");
  564. assert_eq!(announce_req[92..98].to_hex(), "ffffffff1a19");
  565. let announce_resp_buf = b"000000017a638a60000006e8000000030000002429d412a11ae12d53dcbd1a19d048c0e51ae1d8241960c8d5d5c36e71c8d5c5b974a31ae2c11ef348d4aabc5f370ec8d5bc4e16321ae1b9cee13b2327b94187b66f7cb94186b1c8d5b75308331ae1b068c0e0c263ac6f857911389d27ac821ae19088c2c01ae172fe2468c00a699aebe6720f68a2f99a1ae167fce2141ae163582ee41ae1634921a5d2725b72aaf5c8d559482e8fc9d257fb394cc8d55740e9ebd166524044e11aff51b6dcb6c8d54e2ebe61c3574b87860fc8d54b6e11026dff473afc7a1ec944cd47cd1ae131249b051ae124ff6b521ae105b75c13c8d50551153a1ae105024e09cd52";
  566. let ann_resp = msg_parse_announce_resp(&announce_resp_buf.to_vec());
  567. assert_eq!(ann_resp.peers.len(), 81);
  568. assert_eq!(ann_resp.peers[0].ip, "48.54.101.56");
  569. assert_eq!(ann_resp.peers[0].port, 12336);
  570. assert_eq!(ann_resp.peers[80].ip, "52.101.48.57");
  571. assert_eq!(ann_resp.peers[80].port, 25444);
  572. }
  573. #[test]
  574. fn pieces() {
  575. let t = Torrent::open("test.torrent");
  576. let mut p = Pieces::new(&t);
  577. // println!("{:?}", p);
  578. let payload: Payload = Payload{
  579. index: 0,
  580. begin: 0,
  581. length: 0,
  582. block: Block{
  583. length: 0,
  584. bytes: Vec::new()
  585. }
  586. };
  587. assert_eq!(true, p.needed(&payload));
  588. p.add_requested(&payload);
  589. p.add_received(&payload);
  590. assert_eq!(false, p.needed(&payload));
  591. assert_eq!(false, p.is_done());
  592. }
  593. #[async_std::test]
  594. async fn get_peers() {
  595. let t = Torrent::open("test.torrent");
  596. // println!("{:?}", t);
  597. println!("torrent: {:?}", t.info.name);
  598. println!("protocol: {:?}", t.protocol().unwrap());
  599. println!("msg_conn_req: {:?}", msg_conn_req());
  600. let peers_w = t.get_peers().await;
  601. println!("peers getted");
  602. let peers = peers_w.unwrap();
  603. // println!("get_peers peers: {:?}", peers);
  604. }
  605. }