diff options
| author | Max Audron <audron@cocaine.farm> | 2020-01-19 18:08:09 +0100 |
|---|---|---|
| committer | Max Audron <audron@cocaine.farm> | 2020-01-19 18:08:09 +0100 |
| commit | 59af320a53cdf5bbcbbf5c0b2aa44127e8c5dfdd (patch) | |
| tree | be4d3d060fa0a3431f35da3e968ad84bbba62628 /src/net.rs | |
| parent | add ClientLogin (diff) | |
update
Diffstat (limited to 'src/net.rs')
| -rw-r--r-- | src/net.rs | 51 |
1 files changed, 39 insertions, 12 deletions
@@ -4,18 +4,26 @@ use std::io::{Error}; use std::result::Result; use std::net::TcpStream; use std::vec::Vec; +use std::convert::TryInto; +use std::io::Cursor; + +use flate2::Compress; +use flate2::Decompress; +use flate2::Compression; +use flate2::FlushCompress; +use flate2::FlushDecompress; +use flate2::read::ZlibDecoder; extern crate log; // use log::{info, warn, debug}; - use crate::protocol::message; use crate::protocol::error::ErrorKind; pub struct Client { tcp_stream: TcpStream, - pub address: &'static str, - pub port: u32, + encoder: Compress, + decoder: Decompress, pub tls: bool, pub compression: bool, } @@ -25,24 +33,25 @@ impl Client { use crate::protocol::message::handshake::{HandshakeDeserialize, HandshakeSerialize, HandshakeQRead, VariantMap}; use crate::protocol::message::handshake::{ClientInitAck, ClientLogin, ClientLoginAck, SessionInit}; - self.tcp_stream.write(&client.serialize().unwrap()).unwrap(); + self.write(&client.serialize().unwrap()).unwrap(); let mut buf: Vec<u8> = [0; 2048].to_vec(); - let len = VariantMap::read(&mut self.tcp_stream, &mut buf).unwrap(); + let len = VariantMap::read(self, &mut buf).unwrap(); buf.truncate(len); let res = ClientInitAck::parse(&buf).unwrap(); println!("res: {:?}", res); let login = ClientLogin {user: user.to_string(), password: pass.to_string()}; - self.tcp_stream.write(&login.serialize().unwrap()).unwrap(); + self.write(&login.serialize().unwrap()).unwrap(); + println!("res: {:?}", res); let mut buf: Vec<u8> = [0; 2048].to_vec(); - let len = VariantMap::read(&mut self.tcp_stream, &mut buf).unwrap(); + let len = VariantMap::read(self, &mut buf).unwrap(); buf.truncate(len); let _res = ClientLoginAck::parse(&buf).unwrap(); let mut buf: Vec<u8> = [0; 2048].to_vec(); - let len = VariantMap::read(&mut self.tcp_stream, &mut buf).unwrap(); + let len = VariantMap::read(self, &mut buf).unwrap(); buf.truncate(len); let res = SessionInit::parse(&buf).unwrap(); @@ -50,10 +59,27 @@ impl Client { } } +impl std::io::Read for Client { + fn read(&mut self, buf: &mut [u8]) -> Result<usize, Error> { + return self.tcp_stream.read(buf); + } +} + +impl std::io::Write for Client { + fn write(&mut self, buf: &[u8]) -> Result<usize, Error> { + let mut cbuf = Vec::with_capacity(buf.len()); + self.encoder.compress_vec(buf, &mut cbuf, FlushCompress::Finish)?; + return self.tcp_stream.write(&buf); + } + + fn flush(&mut self) -> Result<(), Error> { + return self.tcp_stream.flush(); + } +} + pub fn connect(address: &'static str, port: u32, tls: bool, compression: bool) -> Result<Client, Error> { use crate::protocol::primitive::deserialize::Deserialize; - //let mut s = BufWriter::new(TcpStream::connect(format!("{}:{}", address, port)).unwrap()); let mut s = TcpStream::connect(format!("{}:{}", address, port)).unwrap(); // Set Features @@ -90,14 +116,15 @@ pub fn connect(address: &'static str, port: u32, tls: bool, compression: bool) - } let mut buf = [0; 4]; - s.read_exact(&mut buf)?; + s.read(&mut buf)?; let (_, val) = ConnAck::parse(&buf).unwrap(); println!("Received: {:?}", val); +// let sock = ZlibDecoder::new_with_buf(s, [0; 1].to_vec()); let server: Client = Client { tcp_stream: s, - address: address, - port: port, + encoder: Compress::new(Compression::best(), true), + decoder: Decompress::new(true), tls: tls, compression: compression, }; |
