fix: return local address for direct WebSocket connections

This commit is contained in:
21pages committed 2026-10-14 20:04:48 +08:00
1 parent 0ccaaf2cf6
commit 423fb71085
2 files changed
+7 -4

No files matched your search

+2 -2
View File
@@ -213,8 +213,8 @@ impl WsFramedStream {
match stream { match stream {
Either::Left(stream) => { Either::Left(stream) => {
// MaybeTlsStream::get_ref() handles Plain, NativeTls and Rustls, // MaybeTlsStream::get_ref() handles Plain, NativeTls and Rustls,
// returning the underlying TcpStream for peer_addr(). // returning the underlying TcpStream for local_addr().
let addr = stream.get_ref().get_ref().peer_addr()?; let addr = stream.get_ref().get_ref().local_addr()?;
Ok((Either::Left(stream), addr)) Ok((Either::Left(stream), addr))
} }
Either::Right((stream, addr)) => Ok((Either::Right(stream), addr)), Either::Right((stream, addr)) => Ok((Either::Right(stream), addr)),
+5 -2
View File
@@ -243,19 +243,22 @@ async fn direct_round_trip(wss: bool) {
let url = format!("{}://{addr}/ws/id", if wss { "wss" } else { "ws" }); let url = format!("{}://{addr}/ws/id", if wss { "wss" } else { "ws" });
upsert_tls_cache(&url, TlsType::Rustls, true); upsert_tls_cache(&url, TlsType::Rustls, true);
let server = tokio::spawn(async move { let server = tokio::spawn(async move {
let (stream, _) = listener.accept().await.unwrap(); let (stream, client_addr) = listener.accept().await.unwrap();
let mut stream = DynTcpStream(Box::new(stream)); let mut stream = DynTcpStream(Box::new(stream));
if wss { if wss {
stream = DynTcpStream(Box::new(tls_acceptor().accept(stream).await.unwrap())); stream = DynTcpStream(Box::new(tls_acceptor().accept(stream).await.unwrap()));
} }
echo(stream, "/ws/id", &addr.to_string()).await; echo(stream, "/ws/id", &addr.to_string()).await;
client_addr
}); });
let stream = socket_client::connect_tcp(url, TIMEOUT).await.unwrap(); let stream = socket_client::connect_tcp(url, TIMEOUT).await.unwrap();
let local_addr = stream.local_addr();
exchange(stream).await; exchange(stream).await;
timeout(Duration::from_millis(TIMEOUT), server) let client_addr = timeout(Duration::from_millis(TIMEOUT), server)
.await .await
.unwrap() .unwrap()
.unwrap(); .unwrap();
assert_eq!(local_addr, client_addr);
} }
async fn tcp_proxy_round_trip() { async fn tcp_proxy_round_trip() {