ntex_h2/client/
mod.rs

1//! Http2 client
2
3mod 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/// Errors which can occur when attempting to handle http2 client connection.
16#[derive(thiserror::Error, Debug)]
17pub enum ClientError {
18    /// Protocol error
19    #[error("Protocol error: {0}")]
20    Protocol(Box<ConnectionError>),
21    /// Operation error
22    #[error("Operation error: {0}")]
23    Operation(#[from] OperationError),
24    /// Http/2 frame codec error
25    #[error("Http/2 codec error: {0}")]
26    Frame(#[from] frame::FrameError),
27    /// Handshake timeout
28    #[error("Handshake timeout")]
29    HandshakeTimeout,
30    /// Connect error
31    #[error("Connect error: {0}")]
32    Connect(Box<ntex_net::connect::ConnectError>),
33    /// Peer disconnected
34    #[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    /// New request is prepared
74    fn on_request(&mut self, id: frame::StreamId, headers: &mut frame::Headers);
75
76    /// Bytes has been written to memory
77    fn on_request_sent(&mut self, id: frame::StreamId);
78
79    /// Payload data has been written to memory
80    fn on_request_payload(&mut self, id: frame::StreamId, data: &frame::Data);
81
82    /// Response is received
83    fn on_response(&mut self, id: frame::StreamId, headers: &mut frame::Headers);
84
85    /// Payload data has been received
86    fn on_response_payload(&mut self, id: frame::StreamId, data: &frame::Data);
87}