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