ntex_h2/client/
mod.rs

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