diff --git a/Cargo.lock b/Cargo.lock
index d915d515b3..981d09853d 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -1894,6 +1894,7 @@ dependencies = [
"http 1.2.0",
"http-body",
"hyper",
+ "hyper-util",
"linkerd-duplex",
"linkerd-error",
"linkerd-http-box",
diff --git a/linkerd/http/upgrade/Cargo.toml b/linkerd/http/upgrade/Cargo.toml
index 39df18cc9f..dee6ac64f9 100644
--- a/linkerd/http/upgrade/Cargo.toml
+++ b/linkerd/http/upgrade/Cargo.toml
@@ -16,6 +16,10 @@ futures = { version = "0.3", default-features = false }
http = { workspace = true }
http-body = { workspace = true }
hyper = { workspace = true, default-features = false, features = ["client"] }
+hyper-util = { workspace = true, default-features = false, features = [
+ "client",
+ "client-legacy",
+] }
pin-project = "1"
tokio = { version = "1", default-features = false }
tower = { version = "0.4", default-features = false }
diff --git a/linkerd/http/upgrade/src/glue.rs b/linkerd/http/upgrade/src/glue.rs
index 9557fc9d86..acf57f3125 100644
--- a/linkerd/http/upgrade/src/glue.rs
+++ b/linkerd/http/upgrade/src/glue.rs
@@ -1,7 +1,7 @@
use crate::upgrade::Http11Upgrade;
use futures::{ready, TryFuture};
-use http_body::Body;
-use hyper::client::connect as hyper_connect;
+use http_body::{Body, Frame};
+use hyper_util::client::legacy::connect as hyper_connect;
use linkerd_error::{Error, Result};
use linkerd_http_box::BoxBody;
use linkerd_io::{self as io, AsyncRead, AsyncWrite};
@@ -63,38 +63,21 @@ where
self.body.is_end_stream()
}
- fn poll_data(
+ fn poll_frame(
self: Pin<&mut Self>,
cx: &mut Context<'_>,
- ) -> Poll