@@ -175,6 +175,9 @@ use tokio::io::AsyncReadExt;
175175use tokio:: io:: AsyncWrite ;
176176use tokio:: io:: AsyncWriteExt ;
177177
178+ use miniz_oxide:: DataFormat ;
179+ use miniz_oxide:: inflate:: stream:: InflateState ;
180+
178181pub use crate :: close:: CloseCode ;
179182pub use crate :: error:: WebSocketError ;
180183pub use crate :: fragment:: FragmentCollector ;
@@ -208,6 +211,8 @@ pub(crate) struct ReadHalf {
208211 writev_threshold : usize ,
209212 max_message_size : usize ,
210213 buffer : BytesMut ,
214+
215+ state : InflateState ,
211216}
212217
213218#[ cfg( feature = "unstable-split" ) ]
@@ -364,6 +369,7 @@ pub struct WebSocket<S> {
364369 stream : S ,
365370 write_half : WriteHalf ,
366371 read_half : ReadHalf ,
372+
367373}
368374
369375impl < ' f , S > WebSocket < S > {
@@ -577,6 +583,8 @@ impl ReadHalf {
577583 pub fn after_handshake ( role : Role ) -> Self {
578584 let buffer = BytesMut :: with_capacity ( 8192 ) ;
579585
586+ let state = InflateState :: new ( DataFormat :: Raw ) ;
587+
580588 Self {
581589 role,
582590 auto_apply_mask : true ,
@@ -585,6 +593,7 @@ impl ReadHalf {
585593 writev_threshold : 1024 ,
586594 max_message_size : 64 << 20 ,
587595 buffer,
596+ state,
588597 }
589598 }
590599
@@ -610,6 +619,13 @@ impl ReadHalf {
610619 frame. unmask ( )
611620 } ;
612621
622+ if frame. compressed {
623+ frame = match frame. inflate ( & mut self . state ) {
624+ Ok ( frame) => frame,
625+ Err ( e) => return ( Err ( e) , None ) ,
626+ }
627+ }
628+
613629 match frame. opcode {
614630 OpCode :: Close if self . auto_close => {
615631 match frame. payload . len ( ) {
@@ -681,7 +697,11 @@ impl ReadHalf {
681697 let rsv2 = self . buffer [ 0 ] & 0b00100000 != 0 ;
682698 let rsv3 = self . buffer [ 0 ] & 0b00010000 != 0 ;
683699
684- if rsv1 || rsv2 || rsv3 {
700+ let mut compressed = false ;
701+
702+ if rsv1 && !rsv2 && !rsv3 {
703+ compressed = true ;
704+ } else if rsv1 || rsv2 || rsv3 {
685705 return Err ( WebSocketError :: ReservedBitsNotZero ) ;
686706 }
687707
@@ -744,7 +764,7 @@ impl ReadHalf {
744764
745765 // if we read too much it will stay in the buffer, for the next call to this method
746766 let payload = self . buffer . split_to ( payload_len) ;
747- let frame = Frame :: new ( fin, opcode, mask, Payload :: Bytes ( payload) ) ;
767+ let frame = Frame :: new ( fin, opcode, mask, Payload :: Bytes ( payload) , compressed ) ;
748768 Ok ( frame)
749769 }
750770}
0 commit comments