1+ use std:: io;
12use std:: net:: SocketAddr ;
23use std:: ops:: { Deref , DerefMut } ;
34use std:: result:: Result as StdResult ;
@@ -7,10 +8,12 @@ use tokio::io::{AsyncReadExt as _, AsyncWriteExt as _};
78use tokio:: net:: lookup_host;
89
910use super :: { SocketOptions , TcpSocket } ;
11+ use crate :: net:: { AddressProvider , AnySocketAddr } ;
1012use crate :: time:: Duration ;
1113
1214pub struct TcpStream {
1315 pub ( crate ) stream : tokio:: net:: TcpStream ,
16+ pub ( crate ) host : Option < String > ,
1417 pub ( crate ) read_timeout : Option < Duration > ,
1518 pub ( crate ) write_timeout : Option < Duration > ,
1619}
@@ -35,19 +38,29 @@ impl From<tokio::net::TcpStream> for TcpStream {
3538 fn from ( stream : tokio:: net:: TcpStream ) -> Self {
3639 TcpStream {
3740 stream,
41+ host : None ,
3842 read_timeout : None ,
3943 write_timeout : None ,
4044 }
4145 }
4246}
4347
48+ impl AddressProvider for TcpStream {
49+ fn local_addr ( & self ) -> io:: Result < AnySocketAddr > {
50+ self . stream . local_addr ( ) . map ( AnySocketAddr :: Tcp )
51+ }
52+
53+ fn peer_addr ( & self ) -> io:: Result < AnySocketAddr > {
54+ self . stream . peer_addr ( ) . map ( AnySocketAddr :: Tcp )
55+ }
56+ }
57+
4458impl UserData for TcpStream {
4559 fn register ( registry : & mut UserDataRegistry < Self > ) {
4660 registry. add_async_function ( "connect" , connect) ;
4761
48- registry. add_method ( "local_addr" , |_, this, ( ) | Ok ( this. local_addr ( ) ?. to_string ( ) ) ) ;
49-
50- registry. add_method ( "peer_addr" , |_, this, ( ) | Ok ( this. peer_addr ( ) ?. to_string ( ) ) ) ;
62+ registry. add_method ( "local_addr" , |_, this, ( ) | Ok ( this. local_addr ( ) ?) ) ;
63+ registry. add_method ( "peer_addr" , |_, this, ( ) | Ok ( this. peer_addr ( ) ?) ) ;
5164
5265 registry. add_method_mut ( "set_read_timeout" , |_, this, dur : Option < Duration > | {
5366 this. read_timeout = dur;
@@ -101,9 +114,9 @@ impl UserData for TcpStream {
101114
102115pub async fn connect (
103116 _: Lua ,
104- ( addr , params) : ( String , Option < Table > ) ,
117+ ( host , port , params) : ( String , u16 , Option < Table > ) ,
105118) -> Result < StdResult < TcpStream , String > > {
106- let addrs = lua_try ! ( lookup_host( addr ) . await ) ;
119+ let addrs = lua_try ! ( lookup_host( ( & * host , port ) ) . await ) ;
107120 let options = SocketOptions :: from_table ( & params) ?;
108121
109122 let timeout = opt_param ! ( Duration , params, "timeout" ) ?; // A single timeout for any operation
@@ -123,6 +136,7 @@ pub async fn connect(
123136 Ok ( stream) => {
124137 return Ok ( Ok ( TcpStream {
125138 stream,
139+ host : Some ( host. clone ( ) ) ,
126140 read_timeout,
127141 write_timeout,
128142 } ) ) ;
0 commit comments