11//! Contains the WebSocket client.
22extern crate url;
3+ extern crate net2;
34
45use std:: borrow:: {
56 Cow ,
67} ;
78use std:: net:: TcpStream ;
9+ use std:: net:: SocketAddr ;
810use std:: io:: Result as IoResult ;
911use std:: io:: {
1012 Write ,
@@ -35,6 +37,7 @@ use hyper::header::{
3537 ProtocolName ,
3638} ;
3739use unicase:: UniCase ;
40+ use self :: net2:: TcpStreamExt ;
3841
3942use ws;
4043use ws:: sender:: Sender as SenderTrait ;
@@ -111,7 +114,7 @@ pub use self::builder::ClientBuilder;
111114pub struct Client < S >
112115 where S : Stream ,
113116{
114- stream : S ,
117+ pub stream : S ,
115118 sender : Sender ,
116119 receiver : Receiver ,
117120}
@@ -130,7 +133,6 @@ impl Client<TcpStream> {
130133 }
131134}
132135
133- // TODO: add net2 set_nonblocking and stuff
134136impl < S > Client < S >
135137 where S : AsTcpStream + Stream ,
136138{
@@ -139,6 +141,31 @@ impl<S> Client<S>
139141 pub fn shutdown ( & self ) -> IoResult < ( ) > {
140142 self . stream . as_tcp ( ) . shutdown ( Shutdown :: Both )
141143 }
144+
145+ /// See `TcpStream.peer_addr()`.
146+ pub fn peer_addr ( & self ) -> IoResult < SocketAddr > {
147+ self . stream . as_tcp ( ) . peer_addr ( )
148+ }
149+
150+ /// See `TcpStream.local_addr()`.
151+ pub fn local_addr ( & self ) -> IoResult < SocketAddr > {
152+ self . stream . as_tcp ( ) . local_addr ( )
153+ }
154+
155+ /// See `TcpStream.set_nodelay()`.
156+ pub fn set_nodelay ( & mut self , nodelay : bool ) -> IoResult < ( ) > {
157+ self . stream . as_tcp ( ) . set_nodelay ( nodelay)
158+ }
159+
160+ /// See `TcpStream.set_keepalive()`.
161+ pub fn set_keepalive ( & mut self , delay_in_ms : Option < u32 > ) -> IoResult < ( ) > {
162+ TcpStreamExt :: set_keepalive_ms ( self . stream . as_tcp ( ) , delay_in_ms)
163+ }
164+
165+ /// Changes whether the stream is in nonblocking mode.
166+ pub fn set_nonblocking ( & self , nonblocking : bool ) -> IoResult < ( ) > {
167+ self . stream . as_tcp ( ) . set_nonblocking ( nonblocking)
168+ }
142169}
143170
144171impl < ' u , ' p , ' e , ' s , S > Client < S >
@@ -160,9 +187,9 @@ impl<'u, 'p, 'e, 's, S> Client<S>
160187 pub fn unchecked ( stream : S ) -> Self {
161188 Client {
162189 stream : stream,
163- // TODO: always true?
190+ // NOTE: these are always true & false, see
191+ // https://tools.ietf.org/html/rfc6455#section-5
164192 sender : Sender :: new ( true ) ,
165- // TODO: always false?
166193 receiver : Receiver :: new ( false ) ,
167194 }
168195 }
@@ -293,10 +320,10 @@ impl<S> Client<S>
293320 pub fn split ( self ) -> IoResult < ( Reader < <S as Splittable >:: Reader > , Writer < <S as Splittable >:: Writer > ) > {
294321 let ( read, write) = try!( self . stream . split ( ) ) ;
295322 Ok ( ( Reader {
296- reader : read,
323+ stream : read,
297324 receiver : self . receiver ,
298325 } , Writer {
299- writer : write,
326+ stream : write,
300327 sender : self . sender ,
301328 } ) )
302329 }
0 commit comments