Skip to content

Commit

Permalink
feat(client): include connection info in Client::send_request errors (
Browse files Browse the repository at this point in the history
  • Loading branch information
nox committed Apr 14, 2023
1 parent 00d52e4 commit 297dc4c
Show file tree
Hide file tree
Showing 2 changed files with 37 additions and 15 deletions.
28 changes: 14 additions & 14 deletions src/client/client.rs
Original file line number Diff line number Diff line change
Expand Up @@ -251,7 +251,7 @@ where
if req.version() == Version::HTTP_2 {
warn!("Connection is HTTP/1, but request requires HTTP/2");
return Err(ClientError::Normal(
crate::Error::new_user_unsupported_version(),
crate::Error::new_user_unsupported_version().with_client_connect_info(pooled.conn_info.clone()),
));
}

Expand Down Expand Up @@ -281,18 +281,20 @@ where
authority_form(req.uri_mut());
}

let fut = pooled
.send_request_retryable(req)
.map_err(ClientError::map_with_reused(pooled.is_reused()));
let mut res = match pooled.send_request_retryable(req).await {
Err((err, orig_req)) => {
return Err(ClientError::map_with_reused(pooled.is_reused())((
err.with_client_connect_info(pooled.conn_info.clone()),
orig_req,
)));
}
Ok(res) => res,
};

// If the Connector included 'extra' info, add to Response...
let extra_info = pooled.conn_info.extra.clone();
let fut = fut.map_ok(move |mut res| {
if let Some(extra) = extra_info {
extra.set(res.extensions_mut());
}
res
});
if let Some(extra) = &pooled.conn_info.extra {
extra.set(res.extensions_mut());
}

// As of futures@0.1.21, there is a race condition in the mpsc
// channel, such that sending when the receiver is closing can
Expand All @@ -302,11 +304,9 @@ where
// To counteract this, we must check if our senders 'want' channel
// has been closed after having tried to send. If so, error out...
if pooled.is_closed() {
return fut.await;
return Ok(res);
}

let mut res = fut.await?;

// If pooled is HTTP/2, we can toss this reference immediately.
//
// when pooled is dropped, it will try to insert back into the
Expand Down
24 changes: 23 additions & 1 deletion src/error.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,7 @@
//! Error and Result module.

#[cfg(all(feature = "client", any(feature = "http1", feature = "http2")))]
use crate::client::connect::Connected;
use std::error::Error as StdError;
use std::fmt;

Expand All @@ -15,6 +18,8 @@ pub struct Error {
struct ErrorImpl {
kind: Kind,
cause: Option<Cause>,
#[cfg(all(feature = "client", any(feature = "http1", feature = "http2")))]
connect_info: Option<Connected>,
}

#[derive(Debug)]
Expand Down Expand Up @@ -210,9 +215,20 @@ impl Error {
self.inner.cause
}

/// Returns the info of the client connection on which this error occurred.
#[cfg(all(feature = "client", any(feature = "http1", feature = "http2")))]
pub fn client_connect_info(&self) -> Option<&Connected> {
self.inner.connect_info.as_ref()
}

pub(super) fn new(kind: Kind) -> Error {
Error {
inner: Box::new(ErrorImpl { kind, cause: None }),
inner: Box::new(ErrorImpl {
kind,
cause: None,
#[cfg(all(feature = "client", any(feature = "http1", feature = "http2")))]
connect_info: None,
}),
}
}

Expand All @@ -221,6 +237,12 @@ impl Error {
self
}

#[cfg(all(feature = "client", any(feature = "http1", feature = "http2")))]
pub(super) fn with_client_connect_info(mut self, connect_info: Connected) -> Error {
self.inner.connect_info = Some(connect_info);
self
}

#[cfg(any(all(feature = "http1", feature = "server"), feature = "ffi"))]
pub(super) fn kind(&self) -> &Kind {
&self.inner.kind
Expand Down

0 comments on commit 297dc4c

Please sign in to comment.