11use byteorder:: { ByteOrder , LittleEndian } ;
2- use rustls:: { ServerConfig , ServerConnection } ;
2+ #[ cfg( feature = "tls" ) ]
3+ use rustls:: ServerConfig ;
34use std:: io;
45use std:: io:: prelude:: * ;
56
67const U24_MAX : usize = 16_777_215 ;
78
89pub struct PacketConn < RW : Read + Write > {
9- rw : SwitchableConn < RW > ,
10+ #[ cfg( feature = "tls" ) ]
11+ rw : tls:: SwitchableConn < RW > ,
12+ #[ cfg( not( feature = "tls" ) ) ]
13+ rw : RW ,
1014
1115 // read variables
1216 bytes : Vec < u8 > ,
@@ -38,14 +42,17 @@ impl<W: Read + Write> Write for PacketConn<W> {
3842
3943impl < RW : Read + Write > PacketConn < RW > {
4044 pub fn new ( rw : RW ) -> Self {
45+ #[ cfg( feature = "tls" ) ]
46+ let rw = tls:: SwitchableConn :: new ( rw) ;
47+
4148 PacketConn {
4249 bytes : Vec :: new ( ) ,
4350 start : 0 ,
4451 remaining : 0 ,
4552
4653 to_write : vec ! [ 0 , 0 , 0 , 0 ] ,
4754 seq : 0 ,
48- rw : SwitchableConn :: new ( rw ) ,
55+ rw,
4956 }
5057 }
5158}
@@ -68,8 +75,9 @@ impl<W: Read + Write> PacketConn<W> {
6875 self . maybe_end_packet ( )
6976 }
7077
71- pub fn switch_to_tls ( & mut self , config : Arc < ServerConfig > ) -> io:: Result < ( ) > {
72- assert_eq ! ( self . remaining( ) , 0 ) ; // otherwise we've read ahead into the TLS handshake and will be in trouble.
78+ #[ cfg( feature = "tls" ) ]
79+ pub fn switch_to_tls ( & mut self , config : std:: sync:: Arc < ServerConfig > ) -> io:: Result < ( ) > {
80+ assert_eq ! ( self . remaining, 0 ) ; // otherwise we've read ahead into the TLS handshake and will be in trouble.
7381
7482 self . rw . switch_to_tls ( config)
7583 }
@@ -134,10 +142,6 @@ impl<R: Read + Write> PacketConn<R> {
134142 }
135143 }
136144 }
137-
138- pub fn remaining ( & self ) -> usize {
139- self . remaining
140- }
141145}
142146
143147pub fn fullpacket ( i : & [ u8 ] ) -> nom:: IResult < & [ u8 ] , ( u8 , & [ u8 ] ) > {
@@ -171,9 +175,10 @@ impl AsRef<[u8]> for Packet {
171175}
172176
173177use std:: ops:: Deref ;
174- use std:: sync:: Arc ;
175178
179+ #[ cfg( feature = "tls" ) ]
176180use crate :: tls;
181+
177182impl Deref for Packet {
178183 type Target = [ u8 ] ;
179184 fn deref ( & self ) -> & Self :: Target {
@@ -214,60 +219,6 @@ fn packet(i: &[u8]) -> nom::IResult<&[u8], (u8, Packet)> {
214219 ) ( i)
215220}
216221
217- pub ( crate ) struct SwitchableConn < T : Read + Write > ( Option < EitherConn < T > > ) ;
218-
219- pub ( crate ) enum EitherConn < T : Read + Write > {
220- Plain ( T ) ,
221- TLS ( rustls:: StreamOwned < ServerConnection , T > ) ,
222- }
223-
224- impl < T : Read + Write > Read for SwitchableConn < T > {
225- fn read ( & mut self , buf : & mut [ u8 ] ) -> io:: Result < usize > {
226- match & mut self . 0 . as_mut ( ) . unwrap ( ) {
227- EitherConn :: Plain ( p) => p. read ( buf) ,
228- EitherConn :: TLS ( t) => t. read ( buf) ,
229- }
230- }
231- }
232-
233- impl < T : Read + Write > Write for SwitchableConn < T > {
234- fn write ( & mut self , buf : & [ u8 ] ) -> io:: Result < usize > {
235- match & mut self . 0 . as_mut ( ) . unwrap ( ) {
236- EitherConn :: Plain ( p) => p. write ( buf) ,
237- EitherConn :: TLS ( t) => t. write ( buf) ,
238- }
239- }
240-
241- fn flush ( & mut self ) -> io:: Result < ( ) > {
242- match & mut self . 0 . as_mut ( ) . unwrap ( ) {
243- EitherConn :: Plain ( p) => p. flush ( ) ,
244- EitherConn :: TLS ( t) => t. flush ( ) ,
245- }
246- }
247- }
248-
249- impl < T : Read + Write > SwitchableConn < T > {
250- pub fn new ( rw : T ) -> SwitchableConn < T > {
251- SwitchableConn ( Some ( EitherConn :: Plain ( rw) ) )
252- }
253-
254- pub fn switch_to_tls ( & mut self , config : Arc < ServerConfig > ) -> io:: Result < ( ) > {
255- let replacement = match self . 0 . take ( ) {
256- Some ( EitherConn :: Plain ( plain) ) => {
257- Ok ( EitherConn :: TLS ( tls:: create_stream ( plain, config) ?) )
258- }
259- Some ( EitherConn :: TLS ( _) ) => Err ( io:: Error :: new (
260- io:: ErrorKind :: Other ,
261- "tls variant found when plain was expected" ,
262- ) ) ,
263- None => unreachable ! ( ) ,
264- } ?;
265-
266- self . 0 = Some ( replacement) ;
267- Ok ( ( ) )
268- }
269- }
270-
271222#[ cfg( test) ]
272223mod tests {
273224 use super :: * ;
0 commit comments