Skip to content

Commit 986ba5a

Browse files
committed
feat(client): Add connection capturing API to hyper-util
1 parent 16daef6 commit 986ba5a

File tree

3 files changed

+40
-1
lines changed

3 files changed

+40
-1
lines changed

src/client/legacy/client.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ use hyper::rt::Timer;
1818
use hyper::{body::Body, Method, Request, Response, Uri, Version};
1919
use tracing::{debug, trace, warn};
2020

21+
use super::connect::capture::CaptureConnectionExtension;
2122
#[cfg(feature = "tokio")]
2223
use super::connect::HttpConnector;
2324
use super::connect::{Alpn, Connect, Connected, Connection};
@@ -265,6 +266,10 @@ where
265266
) -> Result<Response<hyper::body::Incoming>, Error> {
266267
let mut pooled = self.connection_for(pool_key).await?;
267268

269+
req.extensions_mut()
270+
.get_mut::<CaptureConnectionExtension>()
271+
.map(|conn| conn.set(&pooled.conn_info));
272+
268273
if pooled.is_http1() {
269274
if req.version() == Version::HTTP_2 {
270275
warn!("Connection is HTTP/1, but request requires HTTP/2");

src/client/legacy/connect/mod.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,9 @@ pub mod dns;
7474
#[cfg(feature = "tokio")]
7575
mod http;
7676

77+
pub(crate) mod capture;
78+
pub use capture::{capture_connection, CaptureConnection};
79+
7780
pub use self::sealed::Connect;
7881

7982
/// Describes a type returned by a connector.

tests/legacy_client.rs

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ use http_body_util::{Empty, Full, StreamBody};
1818
use hyper::body::Bytes;
1919
use hyper::body::Frame;
2020
use hyper::Request;
21-
use hyper_util::client::legacy::connect::HttpConnector;
21+
use hyper_util::client::legacy::connect::{capture_connection, HttpConnector};
2222
use hyper_util::client::legacy::Client;
2323
use hyper_util::rt::{TokioExecutor, TokioIo};
2424

@@ -876,3 +876,34 @@ fn alpn_h2() {
876876
);
877877
drop(client);
878878
}
879+
880+
#[test]
881+
fn capture_connection_on_client() {
882+
let _ = pretty_env_logger::try_init();
883+
884+
let rt = runtime();
885+
let connector = DebugConnector::new();
886+
887+
let client = Client::builder(TokioExecutor::new()).build(connector);
888+
889+
let server = TcpListener::bind("127.0.0.1:0").unwrap();
890+
let addr = server.local_addr().unwrap();
891+
thread::spawn(move || {
892+
let mut sock = server.accept().unwrap().0;
893+
//drop(server);
894+
sock.set_read_timeout(Some(Duration::from_secs(5))).unwrap();
895+
sock.set_write_timeout(Some(Duration::from_secs(5)))
896+
.unwrap();
897+
let mut buf = [0; 4096];
898+
sock.read(&mut buf).expect("read 1");
899+
sock.write_all(b"HTTP/1.1 200 OK\r\nContent-Length: 0\r\n\r\n")
900+
.expect("write 1");
901+
});
902+
let mut req = Request::builder()
903+
.uri(&*format!("http://{}/a", addr))
904+
.body(Empty::<Bytes>::new())
905+
.unwrap();
906+
let captured_conn = capture_connection(&mut req);
907+
rt.block_on(client.request(req)).expect("200 OK");
908+
assert!(captured_conn.connection_metadata().is_some());
909+
}

0 commit comments

Comments
 (0)