diff options
Diffstat (limited to '')
-rw-r--r-- | src/client/unencrypted.rs | 76 |
1 files changed, 22 insertions, 54 deletions
diff --git a/src/client/unencrypted.rs b/src/client/unencrypted.rs index d4225d3..ce534c7 100644 --- a/src/client/unencrypted.rs +++ b/src/client/unencrypted.rs @@ -1,19 +1,19 @@ use std::str; use quick_xml::{ - de::Deserializer, events::{BytesDecl, BytesStart, Event}, name::QName, Reader, Writer, }; -use serde::Deserialize; use tokio::io::{BufReader, ReadHalf, WriteHalf}; use tokio::net::TcpStream; use tokio_native_tls::native_tls::TlsConnector; +use crate::element::Element; +use crate::stanza::stream::StreamFeature; +use crate::Jabber; use crate::Result; -use crate::{error::JabberError, stanza::stream::StreamFeature}; -use crate::{stanza::stream::StreamFeatures, Jabber}; +use crate::{error::JabberError, stanza::stream::Stream}; pub struct JabberClient<'j> { reader: Reader<BufReader<ReadHalf<TcpStream>>>, @@ -35,63 +35,30 @@ impl<'j> JabberClient<'j> { } pub async fn start_stream(&mut self) -> Result<()> { + // client to server let declaration = BytesDecl::new("1.0", None, None); - let mut stream_element = BytesStart::new("stream:stream"); - stream_element.push_attribute(("from".as_bytes(), self.jabber.jid.to_string().as_bytes())); - stream_element.push_attribute(("to".as_bytes(), self.jabber.server.as_bytes())); - stream_element.push_attribute(("version", "1.0")); - stream_element.push_attribute(("xml:lang", "en")); - stream_element.push_attribute(("xmlns", "jabber:client")); - stream_element.push_attribute(("xmlns:stream", "http://etherx.jabber.org/streams")); + let server = &self.jabber.server.to_owned().try_into()?; + let stream_element = + Stream::new_client(&self.jabber.jid, server, None, Some("en".to_string())); self.writer .write_event_async(Event::Decl(declaration)) - .await; - self.writer - .write_event_async(Event::Start(stream_element)) - .await - .unwrap(); + .await?; + let stream_element: Element<'_> = stream_element.into(); + stream_element.write_start(&mut self.writer).await?; + // server to client let mut buf = Vec::new(); - loop { - match self.reader.read_event_into_async(&mut buf).await.unwrap() { - Event::Start(e) => { - println!("{:?}", e); - break; - } - Event::Decl(e) => println!("decl: {:?}", e), - _ => return Err(JabberError::BadStream), - } - } + self.reader.read_event_into_async(&mut buf).await?; + let _stream_response = Element::read_start(&mut self.reader).await?; Ok(()) } - pub async fn get_features(&mut self) -> Result<Vec<StreamFeature>> { - let mut buf = Vec::new(); - let mut txt = Vec::new(); - let mut loop_end = false; - while !loop_end { - match self.reader.read_event_into_async(&mut buf).await.unwrap() { - Event::End(e) => { - if e.name() == QName(b"stream:features") { - loop_end = true; - } - } - _ => (), - } - txt.push(b'<'); - txt = txt - .into_iter() - .chain(buf.to_owned()) - .chain(vec![b'>']) - .collect(); - buf.clear(); + pub async fn get_features(&mut self) -> Result<Option<Vec<StreamFeature>>> { + if let Some(features) = Element::read(&mut self.reader).await? { + println!("{:?}", features); + Ok(Some(features.try_into()?)) + } else { + Ok(None) } - println!("{:?}", txt); - let decoded = str::from_utf8(&txt).unwrap(); - println!("decoded: {:?}", decoded); - let mut deserializer = Deserializer::from_str(decoded); - let features = StreamFeatures::deserialize(&mut deserializer).unwrap(); - println!("{:?}", features); - Ok(features.features) } pub async fn starttls(mut self) -> Result<super::encrypted::JabberClient<'j>> { @@ -115,8 +82,9 @@ impl<'j> JabberClient<'j> { .connect(&self.jabber.server, stream) .await { - let (read, writer) = tokio::io::split(tlsstream); + let (read, write) = tokio::io::split(tlsstream); let reader = Reader::from_reader(BufReader::new(read)); + let writer = Writer::new(write); let mut client = super::encrypted::JabberClient::new(reader, writer, self.jabber); client.start_stream().await?; |