clean up xml serialization
This commit is contained in:
parent
543378cb52
commit
6f9f526385
|
@ -9,30 +9,29 @@ use tokio_rustls::{TlsConnector, rustls::ClientConfig, webpki::DNSNameRef, clien
|
||||||
use tokio::{net::TcpStream, io::AsyncWriteExt, io::AsyncReadExt, io::split, io::ReadHalf, io::WriteHalf};
|
use tokio::{net::TcpStream, io::AsyncWriteExt, io::AsyncReadExt, io::split, io::ReadHalf, io::WriteHalf};
|
||||||
|
|
||||||
use crate::config::{CONFIG, EppClientConnection};
|
use crate::config::{CONFIG, EppClientConnection};
|
||||||
use tokio::time::{sleep, Duration};
|
|
||||||
use crate::error;
|
use crate::error;
|
||||||
use crate::epp::request::EppRequest;
|
use crate::epp::request::{EppRequest, Login};
|
||||||
|
use crate::epp::xml::EppXml;
|
||||||
|
|
||||||
struct ConnectionStream {
|
pub struct ConnectionStream {
|
||||||
reader: ReadHalf<TlsStream<TcpStream>>,
|
reader: ReadHalf<TlsStream<TcpStream>>,
|
||||||
writer: WriteHalf<TlsStream<TcpStream>>,
|
writer: WriteHalf<TlsStream<TcpStream>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
struct EppConnection {
|
pub struct EppConnection {
|
||||||
registry: String,
|
registry: String,
|
||||||
credentials: (String, String),
|
|
||||||
stream: ConnectionStream,
|
stream: ConnectionStream,
|
||||||
pub greeting: String,
|
pub greeting: String,
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct EppClient {
|
pub struct EppClient {
|
||||||
|
credentials: (String, String),
|
||||||
connection: EppConnection,
|
connection: EppConnection,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl EppConnection {
|
impl EppConnection {
|
||||||
pub async fn new(
|
pub async fn new(
|
||||||
registry: String,
|
registry: String,
|
||||||
credentials: (String, String),
|
|
||||||
mut stream: ConnectionStream) -> Result<EppConnection, Box<dyn Error>> {
|
mut stream: ConnectionStream) -> Result<EppConnection, Box<dyn Error>> {
|
||||||
let mut buf = vec![0u8; 4096];
|
let mut buf = vec![0u8; 4096];
|
||||||
stream.reader.read(&mut buf).await?;
|
stream.reader.read(&mut buf).await?;
|
||||||
|
@ -40,7 +39,6 @@ impl EppConnection {
|
||||||
|
|
||||||
Ok(EppConnection {
|
Ok(EppConnection {
|
||||||
registry: registry,
|
registry: registry,
|
||||||
credentials: credentials,
|
|
||||||
stream: stream,
|
stream: stream,
|
||||||
greeting: greeting
|
greeting: greeting
|
||||||
})
|
})
|
||||||
|
@ -66,9 +64,6 @@ impl EppConnection {
|
||||||
buf[..4].clone_from_slice(&len_u32);
|
buf[..4].clone_from_slice(&len_u32);
|
||||||
buf[4..].clone_from_slice(&content.as_bytes());
|
buf[4..].clone_from_slice(&content.as_bytes());
|
||||||
|
|
||||||
let conv = str::from_utf8(&buf[4..])?;
|
|
||||||
println!("reconverted: {}", conv);
|
|
||||||
|
|
||||||
self.write(&buf).await
|
self.write(&buf).await
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -141,8 +136,22 @@ impl Drop for EppConnection {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl EppClient {
|
impl EppClient {
|
||||||
|
pub async fn new(connection: EppConnection, credentials: (String, String)) -> Result<EppClient, Box<dyn Error>> {
|
||||||
|
let mut client = EppClient {
|
||||||
|
connection: connection,
|
||||||
|
credentials: credentials
|
||||||
|
};
|
||||||
|
|
||||||
|
let client_trid = EppRequest::generate_client_trid(&client.credentials.0)?;
|
||||||
|
let login_request = Login::new(&client.credentials.0, &client.credentials.1, client_trid.as_str());
|
||||||
|
|
||||||
|
client.transact(&login_request).await?;
|
||||||
|
|
||||||
|
Ok(client)
|
||||||
|
}
|
||||||
|
|
||||||
pub async fn transact(&mut self, request: &EppRequest) -> Result<String, Box<dyn Error>> {
|
pub async fn transact(&mut self, request: &EppRequest) -> Result<String, Box<dyn Error>> {
|
||||||
let epp_xml = request.to_epp_xml()?;
|
let epp_xml = request.serialize()?;
|
||||||
|
|
||||||
println!("Request:\r\n{}", epp_xml);
|
println!("Request:\r\n{}", epp_xml);
|
||||||
|
|
||||||
|
@ -207,11 +216,10 @@ pub async fn connect(registry: &'static str) -> Result<EppClient, Box<dyn Error>
|
||||||
|
|
||||||
let connection = EppConnection::new(
|
let connection = EppConnection::new(
|
||||||
registry.to_string(),
|
registry.to_string(),
|
||||||
credentials,
|
|
||||||
stream
|
stream
|
||||||
).await.unwrap();
|
).await.unwrap();
|
||||||
|
|
||||||
let client = EppClient { connection: connection };
|
let client = EppClient::new(connection, credentials).await.unwrap();
|
||||||
|
|
||||||
tx.send(client).unwrap();
|
tx.send(client).unwrap();
|
||||||
});
|
});
|
||||||
|
|
|
@ -1,2 +1,3 @@
|
||||||
pub mod objects;
|
pub mod quick_xml;
|
||||||
pub mod request;
|
pub mod request;
|
||||||
|
pub mod xml;
|
||||||
|
|
|
@ -0,0 +1,13 @@
|
||||||
|
use quick_xml::se;
|
||||||
|
use std::error::Error;
|
||||||
|
|
||||||
|
use crate::epp::request::EppObject;
|
||||||
|
use crate::epp::xml::{EppXml, EPP_XML_HEADER};
|
||||||
|
|
||||||
|
impl EppXml for EppObject {
|
||||||
|
fn serialize(&self) -> Result<String, Box<dyn Error>> {
|
||||||
|
let epp_xml = format!("{}\r\n{}", EPP_XML_HEADER, se::to_string(self)?);
|
||||||
|
|
||||||
|
Ok(epp_xml)
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,8 +1,7 @@
|
||||||
use quick_xml::se;
|
use serde::{Deserialize, Serialize};
|
||||||
use serde::{Deserialize, Serialize, Serializer};
|
|
||||||
use std::error::Error;
|
use std::error::Error;
|
||||||
|
use std::time::SystemTime;
|
||||||
|
|
||||||
const EPP_XML_HEADER: &str = r#"<?xml version="1.0" encoding="UTF-8" standalone="no"?>"#;
|
|
||||||
const EPP_XMLNS: &str = "urn:ietf:params:xml:ns:epp-1.0";
|
const EPP_XMLNS: &str = "urn:ietf:params:xml:ns:epp-1.0";
|
||||||
const EPP_XMLNS_XSI: &str = "http://www.w3.org/2001/XMLSchema-instance";
|
const EPP_XMLNS_XSI: &str = "http://www.w3.org/2001/XMLSchema-instance";
|
||||||
const EPP_XSI_SCHEMA_LOCATION: &str = "urn:ietf:params:xml:ns:epp-1.0 epp-1.0.xsd";
|
const EPP_XSI_SCHEMA_LOCATION: &str = "urn:ietf:params:xml:ns:epp-1.0 epp-1.0.xsd";
|
||||||
|
@ -61,10 +60,9 @@ impl EppObject {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn to_epp_xml(&self) -> Result<String, Box<dyn Error>> {
|
pub fn generate_client_trid(username: &str) -> Result<String, Box<dyn Error>> {
|
||||||
let epp_xml = format!("{}\r\n{}", EPP_XML_HEADER, se::to_string(self)?);
|
let timestamp = SystemTime::now().duration_since(SystemTime::UNIX_EPOCH)?;
|
||||||
|
Ok(format!("{}:{}", username, timestamp.as_secs()))
|
||||||
Ok(epp_xml)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,8 @@
|
||||||
|
use std::error::Error;
|
||||||
|
|
||||||
|
pub const EPP_XML_HEADER: &str = r#"<?xml version="1.0" encoding="UTF-8" standalone="no"?>"#;
|
||||||
|
|
||||||
pub trait EppXml {
|
pub trait EppXml {
|
||||||
fn serialize(&self) -> Result<String, Box<dyn Error>>;
|
fn serialize(&self) -> Result<String, Box<dyn Error>>;
|
||||||
fn deserialize(&self) -> Result<Self, Box<dyn Error>>;
|
// fn deserialize(&self) -> Result<Self, Box<dyn Error>>;
|
||||||
}
|
}
|
||||||
|
|
21
src/lib.rs
21
src/lib.rs
|
@ -1,11 +1,12 @@
|
||||||
// pub mod config;
|
// pub mod config;
|
||||||
// pub mod connection;
|
// pub mod connection;
|
||||||
|
// pub mod epp;
|
||||||
|
// pub mod error;
|
||||||
|
|
||||||
// #[cfg(test)]
|
// #[cfg(test)]
|
||||||
// mod tests {
|
// mod tests {
|
||||||
// use super::config;
|
// use super::config;
|
||||||
// use super::connection;
|
// use super::connection;
|
||||||
// use std::str;
|
|
||||||
|
|
||||||
// #[test]
|
// #[test]
|
||||||
// fn config() {
|
// fn config() {
|
||||||
|
@ -22,14 +23,12 @@
|
||||||
|
|
||||||
// #[test]
|
// #[test]
|
||||||
// fn connect() {
|
// fn connect() {
|
||||||
// let mut cn = aw!(connection::connect("hexonet")).unwrap();
|
// let mut client = match aw!(connection::connect("hexonet")) {
|
||||||
// println!("lol");
|
// Ok(client) => {
|
||||||
// let contents = aw!(cn.read()).unwrap();
|
// println!("{}", client.greeting());
|
||||||
|
// client
|
||||||
// match str::from_utf8(&contents) {
|
// },
|
||||||
// Ok(v) => println!("{}", v),
|
// Err(e) => panic!("Error: {}", e)
|
||||||
// Err(e) => panic!("Error: {}", e)
|
// };
|
||||||
// }
|
|
||||||
// aw!(cn.close());
|
|
||||||
// }
|
// }
|
||||||
// }
|
// }
|
||||||
|
|
12
src/main.rs
12
src/main.rs
|
@ -17,19 +17,7 @@ async fn main() {
|
||||||
Err(e) => panic!("Error: {}", e)
|
Err(e) => panic!("Error: {}", e)
|
||||||
};
|
};
|
||||||
|
|
||||||
// sleep(Duration::from_millis(100000)).await;
|
|
||||||
|
|
||||||
let timestamp = SystemTime::now().duration_since(SystemTime::UNIX_EPOCH).unwrap();
|
|
||||||
let cl_trid = format!("eppdev:{}", timestamp.as_secs());
|
|
||||||
let epp_login = request::Login::new("eppdev", "sh48sja#27*A", &cl_trid);
|
|
||||||
|
|
||||||
client.transact(&epp_login).await.unwrap();
|
|
||||||
|
|
||||||
let epp_hello = request::Hello::new();
|
let epp_hello = request::Hello::new();
|
||||||
|
|
||||||
client.transact(&epp_hello).await.unwrap();
|
client.transact(&epp_hello).await.unwrap();
|
||||||
|
|
||||||
//let response = client.transact(&epp_hello).await.unwrap();
|
|
||||||
|
|
||||||
//println!("{}", response);
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue