client: use idna

Astro created

Change summary

Cargo.toml        |  1 +
src/client/mod.rs | 19 ++++++++++++++-----
src/lib.rs        |  1 +
3 files changed, 16 insertions(+), 5 deletions(-)

Detailed changes

Cargo.toml 🔗

@@ -18,3 +18,4 @@ rustc-serialize = "*"
 jid = "*"
 domain = "0.2.1"
 xmpp-parsers = "0.6.0"
+idna = "*"

src/client/mod.rs 🔗

@@ -5,10 +5,11 @@ use tokio_core::reactor::Handle;
 use tokio_core::net::TcpStream;
 use tokio_io::{AsyncRead, AsyncWrite};
 use tokio_tls::TlsStream;
-use futures::{Future, Stream, Poll, Async, Sink, StartSend, AsyncSink};
+use futures::{future, Future, Stream, Poll, Async, Sink, StartSend, AsyncSink};
 use minidom::Element;
 use jid::{Jid, JidParseError};
 use sasl::common::{Credentials, ChannelBinding};
+use idna;
 
 use super::xmpp_codec::Packet;
 use super::xmpp_stream;
@@ -53,19 +54,27 @@ impl Client {
         let jid1 = jid.clone();
         let jid2 = jid.clone();
         let password = password;
+        let domain = match idna::domain_to_ascii(&jid.domain) {
+            Ok(domain) =>
+                domain,
+            Err(e) =>
+                return Box::new(future::err(format!("{:?}", e))),
+        };
         Box::new(
-            Connecter::from_lookup(handle, &jid.domain, "_xmpp-client._tcp", 5222)
+            Connecter::from_lookup(handle, &domain, "_xmpp-client._tcp", 5222)
                 .expect("Connector::from_lookup")
                 .and_then(move |tcp_stream|
                           xmpp_stream::XMPPStream::start(tcp_stream, jid1, NS_JABBER_CLIENT.to_owned())
                           .map_err(|e| format!("{}", e))
                 ).and_then(|xmpp_stream| {
                     if Self::can_starttls(&xmpp_stream) {
-                        Self::starttls(xmpp_stream)
+                        Ok(Self::starttls(xmpp_stream))
                     } else {
-                        panic!("No STARTTLS")
+                        Err("No STARTTLS".to_owned())
                     }
-                }).and_then(|tls_stream|
+                }).and_then(|starttls|
+                            starttls
+                ).and_then(|tls_stream|
                           XMPPStream::start(tls_stream, jid2, NS_JABBER_CLIENT.to_owned())
                           .map_err(|e| format!("{}", e))
                 ).and_then(move |xmpp_stream| {

src/lib.rs 🔗

@@ -11,6 +11,7 @@ extern crate sasl;
 extern crate rustc_serialize as serialize;
 extern crate jid;
 extern crate domain;
+extern crate idna;
 
 pub mod xmpp_codec;
 pub mod xmpp_stream;