@@ -5,7 +5,7 @@ use super::{
55} ;
66
77#[ cfg( any( feature = "brotli" , feature = "gzip" , feature = "zstd" ) ) ]
8- use std:: io;
8+ use std:: io:: { self , Read as _ } ;
99
1010#[ cfg( any( feature = "brotli" , feature = "gzip" , feature = "zstd" ) ) ]
1111use bytes:: Bytes ;
@@ -97,6 +97,40 @@ fn gzip_encoder_releases_retained_output_between_chunks() {
9797 assert_eq ! ( gzip. get_ref( ) . buffer_len( ) , 0 ) ;
9898}
9999
100+ #[ cfg( feature = "gzip" ) ]
101+ #[ test]
102+ fn gzip_encoder_finalizes_decodable_multi_chunk_stream ( ) {
103+ let compressed = encode_multi_chunk_stream ( ResponseCompressionEncoder :: gzip ( 4 , 64 * 1024 ) ) ;
104+ let mut decoded = Vec :: new ( ) ;
105+ flate2:: read:: GzDecoder :: new ( compressed. as_slice ( ) )
106+ . read_to_end ( & mut decoded)
107+ . unwrap ( ) ;
108+
109+ assert_eq ! ( decoded, multi_chunk_plaintext( ) ) ;
110+ }
111+
112+ #[ cfg( feature = "brotli" ) ]
113+ #[ test]
114+ fn brotli_encoder_finalizes_decodable_multi_chunk_stream ( ) {
115+ let compressed = encode_multi_chunk_stream ( ResponseCompressionEncoder :: brotli ( 5 , 64 * 1024 ) ) ;
116+ let mut decoded = Vec :: new ( ) ;
117+ brotli:: Decompressor :: new ( compressed. as_slice ( ) , 4096 )
118+ . read_to_end ( & mut decoded)
119+ . unwrap ( ) ;
120+
121+ assert_eq ! ( decoded, multi_chunk_plaintext( ) ) ;
122+ }
123+
124+ #[ cfg( feature = "zstd" ) ]
125+ #[ test]
126+ fn zstd_encoder_finalizes_decodable_multi_chunk_stream ( ) {
127+ let compressed =
128+ encode_multi_chunk_stream ( ResponseCompressionEncoder :: zstd ( 3 , 64 * 1024 ) . unwrap ( ) ) ;
129+ let decoded = zstd:: stream:: decode_all ( compressed. as_slice ( ) ) . unwrap ( ) ;
130+
131+ assert_eq ! ( decoded, multi_chunk_plaintext( ) ) ;
132+ }
133+
100134#[ cfg( feature = "gzip" ) ]
101135#[ test]
102136fn gzip_limit_failure_discards_encoder ( ) {
@@ -139,3 +173,25 @@ fn assert_limit_failure_discards_encoder(encoder: &mut ResponseCompressionEncode
139173 assert_eq ! ( error. io_kind( ) , Some ( io:: ErrorKind :: InvalidData ) ) ;
140174 assert ! ( encoder. encode_chunk( Some ( & input) , true ) . unwrap( ) . is_empty( ) ) ;
141175}
176+
177+ #[ cfg( any( feature = "brotli" , feature = "gzip" , feature = "zstd" ) ) ]
178+ fn encode_multi_chunk_stream ( mut encoder : ResponseCompressionEncoder ) -> Vec < u8 > {
179+ let mut compressed = Vec :: new ( ) ;
180+ compressed. extend_from_slice (
181+ & encoder
182+ . encode_chunk ( Some ( b"first response segment; " ) , false )
183+ . unwrap ( ) ,
184+ ) ;
185+ compressed. extend_from_slice (
186+ & encoder
187+ . encode_chunk ( Some ( b"second response segment; " ) , false )
188+ . unwrap ( ) ,
189+ ) ;
190+ compressed. extend_from_slice ( & encoder. encode_chunk ( None , true ) . unwrap ( ) ) ;
191+ compressed
192+ }
193+
194+ #[ cfg( any( feature = "brotli" , feature = "gzip" , feature = "zstd" ) ) ]
195+ fn multi_chunk_plaintext ( ) -> & ' static [ u8 ] {
196+ b"first response segment; second response segment; "
197+ }
0 commit comments