Skip to main content

ntex_h2/client/
mod.rs

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