use std::io;
use ntex_error::{ErrorDiagnostic, ResultType};
use ntex_net::connect::ConnectError;
use ntex_util::channel::Canceled;
mod connector;
mod pool;
mod simple;
mod stream;
use crate::{error::ConnectionError, error::OperationError, frame};
pub use self::connector::Connector;
pub use self::pool::{Client, ClientBuilder};
pub use self::simple::SimpleClient;
pub use self::stream::{RecvStream, SendStream};
#[derive(thiserror::Error, Debug)]
pub enum ClientError {
#[error("Protocol error")]
Protocol(#[source] ConnectionError),
#[error("Operation error")]
Operation(
#[from]
#[source]
OperationError,
),
#[error("Http/2 codec error: {0}")]
Frame(#[from] frame::FrameError),
#[error("Handshake timeout")]
HandshakeTimeout,
#[error("Connect error")]
Connect(
#[from]
#[source]
ConnectError,
),
#[error("Peer disconnected")]
Disconnected(
#[from]
#[source]
io::Error,
),
}
impl From<ConnectionError> for ClientError {
fn from(err: ConnectionError) -> Self {
Self::Protocol(err)
}
}
impl From<Canceled> for ClientError {
fn from(err: Canceled) -> Self {
Self::Disconnected(io::Error::other(err))
}
}
impl Clone for ClientError {
fn clone(&self) -> Self {
match self {
Self::Protocol(err) => Self::Protocol(*err),
Self::Operation(err) => Self::Operation(err.clone()),
Self::Frame(err) => Self::Frame(*err),
Self::HandshakeTimeout => Self::HandshakeTimeout,
Self::Connect(err) => Self::Connect(err.clone()),
Self::Disconnected(err) => {
Self::Disconnected(io::Error::new(err.kind(), format!("{err}")))
}
}
}
}
impl ErrorDiagnostic for ClientError {
fn typ(&self) -> ResultType {
ResultType::ServiceError
}
fn signature(&self) -> &'static str {
match self {
ClientError::Protocol(err) => err.signature(),
ClientError::Operation(err) => err.signature(),
ClientError::Connect(err) => err.signature(),
ClientError::Disconnected(err) => err.signature(),
ClientError::Frame(_) => "h2-client-Frame",
ClientError::HandshakeTimeout => "h2-client-HandshakeTimeout",
}
}
}
#[cfg(feature = "unstable")]
pub trait Observer {
fn on_request(&mut self, id: frame::StreamId, headers: &mut frame::Headers);
fn on_request_sent(&mut self, id: frame::StreamId);
fn on_request_payload(&mut self, id: frame::StreamId, data: &frame::Data);
fn on_response(&mut self, id: frame::StreamId, headers: &mut frame::Headers);
fn on_response_payload(&mut self, id: frame::StreamId, data: &frame::Data);
}