connection.rs 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. use util;
  2. use byteorder::{ReadBytesExt, WriteBytesExt, BigEndian};
  3. use std::io::{Write,Read};
  4. use std::net::TcpStream;
  5. pub struct Connection {
  6. stream: TcpStream,
  7. }
  8. impl Connection {
  9. pub fn connect() -> Connection {
  10. Connection {
  11. stream: TcpStream::connect("lon3-accesspoint-a26.ap.spotify.com:4070").unwrap(),
  12. }
  13. }
  14. pub fn send_packet(&mut self, data: &[u8]) -> Vec<u8> {
  15. self.send_packet_prefix(&[], data)
  16. }
  17. pub fn send_packet_prefix(&mut self, prefix: &[u8], data: &[u8]) -> Vec<u8> {
  18. let size = prefix.len() + 4 + data.len();
  19. let mut buf = Vec::with_capacity(size);
  20. buf.write(prefix).unwrap();
  21. buf.write_u32::<BigEndian>(size as u32).unwrap();
  22. buf.write(data).unwrap();
  23. self.stream.write(&buf).unwrap();
  24. buf
  25. }
  26. pub fn recv_packet(&mut self) -> Vec<u8> {
  27. let size : usize = self.stream.read_u32::<BigEndian>().unwrap() as usize;
  28. let mut buffer = util::alloc_buffer(size - 4);
  29. self.stream.read(&mut buffer).unwrap();
  30. buffer
  31. }
  32. }