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