connection.rs 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. use byteorder::{self, BigEndian, ByteOrder, ReadBytesExt, WriteBytesExt};
  2. use shannon::ShannonStream;
  3. use std::convert;
  4. use std::io;
  5. use std::io::{Read, Write};
  6. use std::net::TcpStream;
  7. use std::result;
  8. #[derive(Debug)]
  9. pub enum Error {
  10. IoError(io::Error),
  11. Other
  12. }
  13. pub type Result<T> = result::Result<T, Error>;
  14. impl convert::From<io::Error> for Error {
  15. fn from(err: io::Error) -> Error {
  16. Error::IoError(err)
  17. }
  18. }
  19. impl convert::From<byteorder::Error> for Error {
  20. fn from(err: byteorder::Error) -> Error {
  21. match err {
  22. byteorder::Error::Io(e) => Error::IoError(e),
  23. _ => Error::Other
  24. }
  25. }
  26. }
  27. pub struct PlainConnection {
  28. stream: TcpStream
  29. }
  30. #[derive(Clone)]
  31. pub struct CipherConnection {
  32. stream: ShannonStream<TcpStream>,
  33. }
  34. impl PlainConnection {
  35. pub fn connect() -> Result<PlainConnection> {
  36. Ok(PlainConnection {
  37. stream: try!(TcpStream::connect("lon3-accesspoint-a26.ap.spotify.com:4070")),
  38. })
  39. }
  40. pub fn send_packet(&mut self, data: &[u8]) -> Result<Vec<u8>> {
  41. self.send_packet_prefix(&[], data)
  42. }
  43. pub fn send_packet_prefix(&mut self, prefix: &[u8], data: &[u8]) -> Result<Vec<u8>> {
  44. let size = prefix.len() + 4 + data.len();
  45. let mut buf = Vec::with_capacity(size);
  46. try!(buf.write(prefix));
  47. try!(buf.write_u32::<BigEndian>(size as u32));
  48. try!(buf.write(data));
  49. try!(self.stream.write(&buf));
  50. try!(self.stream.flush());
  51. Ok(buf)
  52. }
  53. pub fn recv_packet(&mut self) -> Result<Vec<u8>> {
  54. let size = try!(self.stream.read_u32::<BigEndian>()) as usize;
  55. let mut buffer = vec![0u8; size];
  56. BigEndian::write_u32(&mut buffer, size as u32);
  57. try!(self.stream.read_exact(&mut buffer[4..]));
  58. Ok(buffer)
  59. }
  60. pub fn into_stream(self) -> TcpStream {
  61. self.stream
  62. }
  63. }
  64. impl CipherConnection {
  65. pub fn new(stream: TcpStream, recv_key: &[u8], send_key: &[u8]) -> CipherConnection {
  66. CipherConnection {
  67. stream: ShannonStream::new(stream, recv_key, send_key)
  68. }
  69. }
  70. pub fn send_packet(&mut self, cmd: u8, data: &[u8]) -> Result<()> {
  71. try!(self.stream.write_u8(cmd)); try!(self.stream.write_u16::<BigEndian>(data.len() as u16));
  72. try!(self.stream.write(data));
  73. try!(self.stream.finish_send());
  74. try!(self.stream.flush());
  75. Ok(())
  76. }
  77. pub fn recv_packet(&mut self) -> Result<(u8, Vec<u8>)> {
  78. let cmd = try!(self.stream.read_u8());
  79. let size = try!(self.stream.read_u16::<BigEndian>()) as usize;
  80. let mut data = vec![0; size];
  81. try!(self.stream.read_exact(&mut data));
  82. try!(self.stream.finish_recv());
  83. Ok((cmd, data))
  84. }
  85. }
  86. pub trait PacketHandler {
  87. fn handle(&mut self, cmd: u8, data: Vec<u8>);
  88. }