1mod connector;
4mod pool;
5mod simple;
6mod stream;
7
8use crate::{error::ConnectionError, error::OperationError, frame};
9
10pub use self::connector::Connector;
11pub use self::pool::{Client, ClientBuilder};
12pub use self::simple::SimpleClient;
13pub use self::stream::{RecvStream, SendStream};
14
15#[derive(thiserror::Error, Debug)]
17pub enum ClientError {
18 #[error("Protocol error: {0}")]
20 Protocol(Box<ConnectionError>),
21 #[error("Operation error: {0}")]
23 Operation(#[from] OperationError),
24 #[error("Http/2 codec error: {0}")]
26 Frame(#[from] frame::FrameError),
27 #[error("Handshake timeout")]
29 HandshakeTimeout,
30 #[error("Connect error: {0}")]
32 Connect(Box<ntex_net::connect::ConnectError>),
33 #[error("Peer disconnected err: {0}")]
35 Disconnected(#[from] std::io::Error),
36}
37
38impl From<ConnectionError> for ClientError {
39 fn from(err: ConnectionError) -> Self {
40 Self::Protocol(Box::new(err))
41 }
42}
43
44impl From<ntex_util::channel::Canceled> for ClientError {
45 fn from(err: ntex_util::channel::Canceled) -> Self {
46 Self::Disconnected(std::io::Error::other(err))
47 }
48}
49
50impl From<ntex_net::connect::ConnectError> for ClientError {
51 fn from(err: ntex_net::connect::ConnectError) -> Self {
52 Self::Connect(Box::new(err))
53 }
54}
55
56impl Clone for ClientError {
57 fn clone(&self) -> Self {
58 match self {
59 Self::Protocol(err) => Self::Protocol(err.clone()),
60 Self::Operation(err) => Self::Operation(err.clone()),
61 Self::Frame(err) => Self::Frame(*err),
62 Self::HandshakeTimeout => Self::HandshakeTimeout,
63 Self::Connect(err) => Self::Connect(err.clone()),
64 Self::Disconnected(err) => {
65 Self::Disconnected(std::io::Error::new(err.kind(), format!("{}", err)))
66 }
67 }
68 }
69}
70
71#[cfg(feature = "unstable")]
72pub trait Observer {
73 fn on_request(&mut self, id: frame::StreamId, headers: &mut frame::Headers);
75
76 fn on_request_sent(&mut self, id: frame::StreamId);
78
79 fn on_request_payload(&mut self, id: frame::StreamId, data: &frame::Data);
81
82 fn on_response(&mut self, id: frame::StreamId, headers: &mut frame::Headers);
84
85 fn on_response_payload(&mut self, id: frame::StreamId, data: &frame::Data);
87}