Use consistent naming for error types
This commit is contained in:
parent
467ac03df7
commit
6d063804d3
|
@ -33,12 +33,12 @@
|
||||||
//! }
|
//! }
|
||||||
//! ```
|
//! ```
|
||||||
|
|
||||||
use std::error::Error;
|
use std::error::Error as StdError;
|
||||||
use std::net::SocketAddr;
|
use std::net::SocketAddr;
|
||||||
|
|
||||||
use crate::common::{Certificate, NoExtension, PrivateKey};
|
use crate::common::{Certificate, NoExtension, PrivateKey};
|
||||||
use crate::connection::EppConnection;
|
use crate::connection::EppConnection;
|
||||||
use crate::error;
|
use crate::error::Error;
|
||||||
use crate::hello::{Greeting, GreetingDocument, HelloDocument};
|
use crate::hello::{Greeting, GreetingDocument, HelloDocument};
|
||||||
use crate::request::{Command, Extension, Transaction};
|
use crate::request::{Command, Extension, Transaction};
|
||||||
use crate::response::Response;
|
use crate::response::Response;
|
||||||
|
@ -59,14 +59,14 @@ impl EppClient {
|
||||||
addr: SocketAddr,
|
addr: SocketAddr,
|
||||||
hostname: &str,
|
hostname: &str,
|
||||||
identity: Option<(Vec<Certificate>, PrivateKey)>,
|
identity: Option<(Vec<Certificate>, PrivateKey)>,
|
||||||
) -> Result<Self, Box<dyn Error>> {
|
) -> Result<Self, Box<dyn StdError>> {
|
||||||
Ok(Self {
|
Ok(Self {
|
||||||
connection: EppConnection::connect(registry, addr, hostname, identity).await?,
|
connection: EppConnection::connect(registry, addr, hostname, identity).await?,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Executes an EPP Hello call and returns the response as an `Greeting`
|
/// Executes an EPP Hello call and returns the response as an `Greeting`
|
||||||
pub async fn hello(&mut self) -> Result<Greeting, Box<dyn Error>> {
|
pub async fn hello(&mut self) -> Result<Greeting, Box<dyn StdError>> {
|
||||||
let hello_xml = HelloDocument::default().serialize()?;
|
let hello_xml = HelloDocument::default().serialize()?;
|
||||||
|
|
||||||
let response = self.connection.transact(&hello_xml).await?;
|
let response = self.connection.transact(&hello_xml).await?;
|
||||||
|
@ -78,7 +78,7 @@ impl EppClient {
|
||||||
&mut self,
|
&mut self,
|
||||||
data: impl Into<RequestData<'a, C, E>> + 'a,
|
data: impl Into<RequestData<'a, C, E>> + 'a,
|
||||||
id: &str,
|
id: &str,
|
||||||
) -> Result<Response<C::Response, E::Response>, error::Error>
|
) -> Result<Response<C::Response, E::Response>, Error>
|
||||||
where
|
where
|
||||||
C: Transaction<E> + Command,
|
C: Transaction<E> + Command,
|
||||||
E: Extension,
|
E: Extension,
|
||||||
|
@ -93,7 +93,7 @@ impl EppClient {
|
||||||
|
|
||||||
/// Accepts raw EPP XML and returns the raw EPP XML response to it.
|
/// Accepts raw EPP XML and returns the raw EPP XML response to it.
|
||||||
/// Not recommended for direct use but sometimes can be useful for debugging
|
/// Not recommended for direct use but sometimes can be useful for debugging
|
||||||
pub async fn transact_xml(&mut self, xml: &str) -> Result<String, Box<dyn Error>> {
|
pub async fn transact_xml(&mut self, xml: &str) -> Result<String, Box<dyn StdError>> {
|
||||||
self.connection.transact(xml).await
|
self.connection.transact(xml).await
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -103,11 +103,11 @@ impl EppClient {
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Returns the greeting received on establishment of the connection as an `Greeting`
|
/// Returns the greeting received on establishment of the connection as an `Greeting`
|
||||||
pub fn greeting(&self) -> Result<Greeting, error::Error> {
|
pub fn greeting(&self) -> Result<Greeting, Error> {
|
||||||
GreetingDocument::deserialize(&self.connection.greeting).map(|obj| obj.data)
|
GreetingDocument::deserialize(&self.connection.greeting).map(|obj| obj.data)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub async fn shutdown(mut self) -> Result<(), Box<dyn Error>> {
|
pub async fn shutdown(mut self) -> Result<(), Box<dyn StdError>> {
|
||||||
self.connection.shutdown().await
|
self.connection.shutdown().await
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,9 +1,9 @@
|
||||||
//! Manages registry connections and reading/writing to them
|
//! Manages registry connections and reading/writing to them
|
||||||
|
|
||||||
use std::convert::TryInto;
|
use std::convert::TryInto;
|
||||||
|
use std::error::Error as StdError;
|
||||||
use std::net::SocketAddr;
|
use std::net::SocketAddr;
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
use std::{error::Error, io as stdio};
|
|
||||||
use std::{io, str, u32};
|
use std::{io, str, u32};
|
||||||
|
|
||||||
use rustls::{OwnedTrustAnchor, RootCertStore};
|
use rustls::{OwnedTrustAnchor, RootCertStore};
|
||||||
|
@ -12,7 +12,7 @@ use tokio_rustls::{client::TlsStream, rustls::ClientConfig, TlsConnector};
|
||||||
use tracing::{debug, info};
|
use tracing::{debug, info};
|
||||||
|
|
||||||
use crate::common::{Certificate, PrivateKey};
|
use crate::common::{Certificate, PrivateKey};
|
||||||
use crate::error;
|
use crate::error::Error;
|
||||||
|
|
||||||
/// EPP Connection struct with some metadata for the connection
|
/// EPP Connection struct with some metadata for the connection
|
||||||
pub(crate) struct EppConnection {
|
pub(crate) struct EppConnection {
|
||||||
|
@ -28,7 +28,7 @@ impl EppConnection {
|
||||||
addr: SocketAddr,
|
addr: SocketAddr,
|
||||||
hostname: &str,
|
hostname: &str,
|
||||||
identity: Option<(Vec<Certificate>, PrivateKey)>,
|
identity: Option<(Vec<Certificate>, PrivateKey)>,
|
||||||
) -> Result<EppConnection, Box<dyn Error>> {
|
) -> Result<EppConnection, Box<dyn StdError>> {
|
||||||
let mut stream = epp_connect(addr, hostname, identity).await?;
|
let mut stream = epp_connect(addr, hostname, identity).await?;
|
||||||
|
|
||||||
let mut buf = vec![0u8; 4096];
|
let mut buf = vec![0u8; 4096];
|
||||||
|
@ -45,7 +45,7 @@ impl EppConnection {
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Constructs an EPP XML request in the required form and sends it to the server
|
/// Constructs an EPP XML request in the required form and sends it to the server
|
||||||
async fn send_epp_request(&mut self, content: &str) -> Result<(), Box<dyn Error>> {
|
async fn send_epp_request(&mut self, content: &str) -> Result<(), Box<dyn StdError>> {
|
||||||
let len = content.len();
|
let len = content.len();
|
||||||
|
|
||||||
let buf_size = len + 4;
|
let buf_size = len + 4;
|
||||||
|
@ -63,7 +63,7 @@ impl EppConnection {
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Receives response from the socket and converts it into an EPP XML string
|
/// Receives response from the socket and converts it into an EPP XML string
|
||||||
async fn get_epp_response(&mut self) -> Result<String, Box<dyn Error>> {
|
async fn get_epp_response(&mut self) -> Result<String, Box<dyn StdError>> {
|
||||||
let mut buf = [0u8; 4];
|
let mut buf = [0u8; 4];
|
||||||
self.stream.read_exact(&mut buf).await?;
|
self.stream.read_exact(&mut buf).await?;
|
||||||
|
|
||||||
|
@ -98,7 +98,7 @@ impl EppConnection {
|
||||||
|
|
||||||
/// Sends an EPP XML request to the registry and return the response
|
/// Sends an EPP XML request to the registry and return the response
|
||||||
/// receieved to the request
|
/// receieved to the request
|
||||||
pub(crate) async fn transact(&mut self, content: &str) -> Result<String, Box<dyn Error>> {
|
pub(crate) async fn transact(&mut self, content: &str) -> Result<String, Box<dyn StdError>> {
|
||||||
debug!("{}: request: {}", self.registry, content);
|
debug!("{}: request: {}", self.registry, content);
|
||||||
self.send_epp_request(content).await?;
|
self.send_epp_request(content).await?;
|
||||||
|
|
||||||
|
@ -109,7 +109,7 @@ impl EppConnection {
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Closes the socket and shuts the connection
|
/// Closes the socket and shuts the connection
|
||||||
pub(crate) async fn shutdown(&mut self) -> Result<(), Box<dyn Error>> {
|
pub(crate) async fn shutdown(&mut self) -> Result<(), Box<dyn StdError>> {
|
||||||
info!("{}: Closing connection", self.registry);
|
info!("{}: Closing connection", self.registry);
|
||||||
|
|
||||||
self.stream.shutdown().await?;
|
self.stream.shutdown().await?;
|
||||||
|
@ -123,7 +123,7 @@ async fn epp_connect(
|
||||||
addr: SocketAddr,
|
addr: SocketAddr,
|
||||||
hostname: &str,
|
hostname: &str,
|
||||||
identity: Option<(Vec<Certificate>, PrivateKey)>,
|
identity: Option<(Vec<Certificate>, PrivateKey)>,
|
||||||
) -> Result<TlsStream<TcpStream>, error::Error> {
|
) -> Result<TlsStream<TcpStream>, Error> {
|
||||||
info!("Connecting to server: {:?}", addr,);
|
info!("Connecting to server: {:?}", addr,);
|
||||||
|
|
||||||
let mut roots = RootCertStore::empty();
|
let mut roots = RootCertStore::empty();
|
||||||
|
@ -147,7 +147,7 @@ async fn epp_connect(
|
||||||
.collect();
|
.collect();
|
||||||
builder
|
builder
|
||||||
.with_single_cert(certs, rustls::PrivateKey(key.0))
|
.with_single_cert(certs, rustls::PrivateKey(key.0))
|
||||||
.map_err(|e| error::Error::Other(e.to_string()))?
|
.map_err(|e| Error::Other(e.to_string()))?
|
||||||
}
|
}
|
||||||
None => builder.with_no_client_auth(),
|
None => builder.with_no_client_auth(),
|
||||||
};
|
};
|
||||||
|
@ -156,8 +156,8 @@ async fn epp_connect(
|
||||||
let stream = TcpStream::connect(&addr).await?;
|
let stream = TcpStream::connect(&addr).await?;
|
||||||
|
|
||||||
let domain = hostname.try_into().map_err(|_| {
|
let domain = hostname.try_into().map_err(|_| {
|
||||||
stdio::Error::new(
|
io::Error::new(
|
||||||
stdio::ErrorKind::InvalidInput,
|
io::ErrorKind::InvalidInput,
|
||||||
format!("Invalid domain: {}", hostname),
|
format!("Invalid domain: {}", hostname),
|
||||||
)
|
)
|
||||||
})?;
|
})?;
|
||||||
|
|
21
src/error.rs
21
src/error.rs
|
@ -1,7 +1,8 @@
|
||||||
//! Error types to wrap internal errors and make EPP errors easier to read
|
//! Error types to wrap internal errors and make EPP errors easier to read
|
||||||
|
|
||||||
use std::error::Error as StdError;
|
use std::error::Error as StdError;
|
||||||
use std::fmt::Display;
|
use std::fmt::{self, Display};
|
||||||
|
use std::io;
|
||||||
|
|
||||||
use crate::response::ResponseStatus;
|
use crate::response::ResponseStatus;
|
||||||
|
|
||||||
|
@ -14,10 +15,10 @@ pub enum Error {
|
||||||
Other(String),
|
Other(String),
|
||||||
}
|
}
|
||||||
|
|
||||||
impl std::error::Error for Error {}
|
impl StdError for Error {}
|
||||||
|
|
||||||
impl Display for Error {
|
impl Display for Error {
|
||||||
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||||
match self {
|
match self {
|
||||||
Error::Command(e) => {
|
Error::Command(e) => {
|
||||||
write!(f, "epp-client EppCommandError: {}", e.result.message)
|
write!(f, "epp-client EppCommandError: {}", e.result.message)
|
||||||
|
@ -28,20 +29,20 @@ impl Display for Error {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl From<std::boxed::Box<dyn std::error::Error>> for Error {
|
impl From<Box<dyn StdError>> for Error {
|
||||||
fn from(e: std::boxed::Box<dyn std::error::Error>) -> Self {
|
fn from(e: Box<dyn StdError>) -> Self {
|
||||||
Self::Other(format!("{:?}", e))
|
Self::Other(format!("{:?}", e))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl From<std::io::Error> for Error {
|
impl From<io::Error> for Error {
|
||||||
fn from(e: std::io::Error) -> Self {
|
fn from(e: io::Error) -> Self {
|
||||||
Self::Io(e)
|
Self::Io(e)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl From<std::io::ErrorKind> for Error {
|
impl From<io::ErrorKind> for Error {
|
||||||
fn from(e: std::io::ErrorKind) -> Self {
|
fn from(e: io::ErrorKind) -> Self {
|
||||||
Self::Io(std::io::Error::from(e))
|
Self::Io(io::Error::from(e))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -90,8 +90,9 @@
|
||||||
pub mod client;
|
pub mod client;
|
||||||
pub mod common;
|
pub mod common;
|
||||||
pub mod connection;
|
pub mod connection;
|
||||||
|
pub mod contact;
|
||||||
pub mod domain;
|
pub mod domain;
|
||||||
pub mod error;
|
mod error;
|
||||||
pub mod hello;
|
pub mod hello;
|
||||||
pub mod login;
|
pub mod login;
|
||||||
pub mod logout;
|
pub mod logout;
|
||||||
|
@ -99,8 +100,6 @@ pub mod request;
|
||||||
pub mod response;
|
pub mod response;
|
||||||
pub mod xml;
|
pub mod xml;
|
||||||
|
|
||||||
pub mod contact;
|
|
||||||
|
|
||||||
pub mod extensions {
|
pub mod extensions {
|
||||||
pub mod consolidate;
|
pub mod consolidate;
|
||||||
pub mod namestore;
|
pub mod namestore;
|
||||||
|
@ -123,6 +122,7 @@ pub mod message {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub use client::EppClient;
|
pub use client::EppClient;
|
||||||
|
pub use error::Error;
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
pub mod tests;
|
pub mod tests;
|
||||||
|
|
|
@ -7,6 +7,7 @@ use crate::{
|
||||||
common::{StringValue, EPP_XMLNS},
|
common::{StringValue, EPP_XMLNS},
|
||||||
response::{Response, ResponseDocument, ResponseStatus},
|
response::{Response, ResponseDocument, ResponseStatus},
|
||||||
xml::EppXml,
|
xml::EppXml,
|
||||||
|
Error,
|
||||||
};
|
};
|
||||||
|
|
||||||
pub const EPP_VERSION: &str = "1.0";
|
pub const EPP_VERSION: &str = "1.0";
|
||||||
|
@ -18,7 +19,7 @@ pub trait Transaction<Ext: Extension>: Command + Sized {
|
||||||
&self,
|
&self,
|
||||||
extension: Option<&Ext>,
|
extension: Option<&Ext>,
|
||||||
client_tr_id: &str,
|
client_tr_id: &str,
|
||||||
) -> Result<String, crate::error::Error> {
|
) -> Result<String, Error> {
|
||||||
<CommandDocument<Self, Ext> as EppXml>::serialize(&CommandDocument::new(CommandWrapper {
|
<CommandDocument<Self, Ext> as EppXml>::serialize(&CommandDocument::new(CommandWrapper {
|
||||||
command: Self::COMMAND,
|
command: Self::COMMAND,
|
||||||
data: self,
|
data: self,
|
||||||
|
@ -29,7 +30,7 @@ pub trait Transaction<Ext: Extension>: Command + Sized {
|
||||||
|
|
||||||
fn deserialize_response(
|
fn deserialize_response(
|
||||||
epp_xml: &str,
|
epp_xml: &str,
|
||||||
) -> Result<Response<Self::Response, Ext::Response>, crate::error::Error> {
|
) -> Result<Response<Self::Response, Ext::Response>, Error> {
|
||||||
let rsp =
|
let rsp =
|
||||||
<ResponseDocument<Self::Response, Ext::Response> as EppXml>::deserialize(epp_xml)?;
|
<ResponseDocument<Self::Response, Ext::Response> as EppXml>::deserialize(epp_xml)?;
|
||||||
match rsp.data.result.code {
|
match rsp.data.result.code {
|
||||||
|
|
Loading…
Reference in New Issue