@@ -121,18 +121,17 @@ async fn connect(
121121) -> ConnectorResult < ( ConnectionResult , UpgradedFramed ) > {
122122 let dest = format ! ( "{}:{}" , config. destination. name( ) , config. destination. port( ) ) ;
123123
124- let stream = TcpStream :: connect ( dest)
124+ let socket = TcpStream :: connect ( dest)
125125 . await
126126 . map_err ( |e| connector:: custom_err!( "TCP connect" , e) ) ?;
127127
128- let server_addr = stream
129- . peer_addr ( )
130- . map_err ( |e| connector:: custom_err!( "Peer address" , e) ) ?;
128+ let client_addr = socket
129+ . local_addr ( )
130+ . map_err ( |e| connector:: custom_err!( "get socket local address" , e) ) ?;
131131
132- let mut framed = ironrdp_tokio:: TokioFramed :: new ( stream ) ;
132+ let mut framed = ironrdp_tokio:: TokioFramed :: new ( socket ) ;
133133
134- let mut connector = connector:: ClientConnector :: new ( config. connector . clone ( ) )
135- . with_client_addr ( server_addr)
134+ let mut connector = connector:: ClientConnector :: new ( config. connector . clone ( ) , client_addr)
136135 . with_static_channel (
137136 ironrdp:: dvc:: DrdynvcClient :: new ( ) . with_dynamic_channel ( DisplayControlClient :: new ( |_| Ok ( Vec :: new ( ) ) ) ) ,
138137 )
@@ -184,15 +183,34 @@ async fn connect_ws(
184183 rdcleanpath : & RDCleanPathConfig ,
185184 cliprdr_factory : Option < & ( dyn CliprdrBackendFactory + Send ) > ,
186185) -> ConnectorResult < ( ConnectionResult , UpgradedFramed ) > {
187- let ( ws, _) = tokio_tungstenite:: connect_async ( & rdcleanpath. url )
186+ let hostname = rdcleanpath
187+ . url
188+ . host_str ( )
189+ . ok_or_else ( || connector:: general_err!( "host missing from the URL" ) ) ?;
190+
191+ let port = rdcleanpath. url . port_or_known_default ( ) . unwrap_or ( 443 ) ;
192+
193+ let socket = TcpStream :: connect ( ( hostname, port) )
194+ . await
195+ . map_err ( |e| connector:: custom_err!( "TCP connect" , e) ) ?;
196+
197+ socket
198+ . set_nodelay ( true )
199+ . map_err ( |e| connector:: custom_err!( "set TCP_NODELAY" , e) ) ?;
200+
201+ let client_addr = socket
202+ . local_addr ( )
203+ . map_err ( |e| connector:: custom_err!( "get socket local address" , e) ) ?;
204+
205+ let ( ws, _) = tokio_tungstenite:: client_async_tls ( rdcleanpath. url . as_str ( ) , socket)
188206 . await
189207 . map_err ( |e| connector:: custom_err!( "WS connect" , e) ) ?;
190208
191209 let ws = crate :: ws:: websocket_compat ( ws) ;
192210
193211 let mut framed = ironrdp_tokio:: TokioFramed :: new ( ws) ;
194212
195- let mut connector = connector:: ClientConnector :: new ( config. connector . clone ( ) )
213+ let mut connector = connector:: ClientConnector :: new ( config. connector . clone ( ) , client_addr )
196214 . with_static_channel (
197215 ironrdp:: dvc:: DrdynvcClient :: new ( ) . with_dynamic_channel ( DisplayControlClient :: new ( |_| Ok ( Vec :: new ( ) ) ) ) ,
198216 )
@@ -312,7 +330,7 @@ where
312330
313331 debug ! ( message = ?rdcleanpath_res, "Received RDCleanPath PDU" ) ;
314332
315- let ( x224_connection_response, server_cert_chain, server_addr ) = match rdcleanpath_res
333+ let ( x224_connection_response, server_cert_chain) = match rdcleanpath_res
316334 . into_enum ( )
317335 . map_err ( |e| connector:: custom_err!( "invalid RDCleanPath PDU" , e) ) ?
318336 {
@@ -324,19 +342,13 @@ where
324342 ironrdp_rdcleanpath:: RDCleanPath :: Response {
325343 x224_connection_response,
326344 server_cert_chain,
327- server_addr,
328- } => ( x224_connection_response, server_cert_chain, server_addr ) ,
345+ server_addr : _ ,
346+ } => ( x224_connection_response, server_cert_chain) ,
329347 ironrdp_rdcleanpath:: RDCleanPath :: Err ( error) => {
330348 return Err ( connector:: custom_err!( "received an RDCleanPath error" , error) ) ;
331349 }
332350 } ;
333351
334- let server_addr = server_addr
335- . parse ( )
336- . map_err ( |e| connector:: custom_err!( "failed to parse server address sent by proxy" , e) ) ?;
337-
338- connector. attach_client_addr ( server_addr) ;
339-
340352 let connector:: ClientConnectorState :: ConnectionInitiationWaitConfirm { .. } = connector. state else {
341353 return Err ( connector:: general_err!( "invalid connector state (wait confirm)" ) ) ;
342354 } ;
0 commit comments