Skip to content

Commit 2855e64

Browse files
committed
feat(decompression-plz): changed decompression_multi to accept generic iterator
1 parent 7f13a29 commit 2855e64

File tree

2 files changed

+46
-32
lines changed

2 files changed

+46
-32
lines changed

decompression-plz/src/decompression/multi/mod.rs

Lines changed: 25 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -11,16 +11,18 @@ use crate::{
1111
pub mod error;
1212
use error::*;
1313

14-
pub fn decompress_multi(
14+
pub fn decompress_multi<'a, T>(
1515
mut compressed: &[u8],
1616
mut writer: &mut Writer<&mut BytesMut>,
17-
encoding_info: &[EncodingInfo],
18-
) -> Result<BytesMut, MultiDecompressError> {
17+
encoding_info: T,
18+
) -> Result<BytesMut, MultiDecompressError>
19+
where
20+
T: Iterator<Item = &'a EncodingInfo> + std::iter::DoubleEndedIterator,
21+
{
1922
let mut input: &[u8] = compressed;
2023
let mut output: BytesMut = writer.get_mut().split();
2124

22-
for (header_index, encoding_info) in encoding_info.iter().rev().enumerate()
23-
{
25+
for (header_index, encoding_info) in encoding_info.rev().enumerate() {
2426
for (compression_index, encoding) in
2527
encoding_info.encodings().iter().rev().enumerate()
2628
{
@@ -77,7 +79,8 @@ mod tests {
7779
],
7880
)];
7981
let result =
80-
decompress_multi(&input, &mut writer, &einfo_list).unwrap();
82+
decompress_multi(&input, &mut writer, &mut einfo_list.iter())
83+
.unwrap();
8184
assert_eq!(result, INPUT);
8285
}
8386

@@ -95,7 +98,8 @@ mod tests {
9598
];
9699

97100
let result =
98-
decompress_multi(&input, &mut writer, &einfo_list).unwrap();
101+
decompress_multi(&input, &mut writer, &mut einfo_list.iter())
102+
.unwrap();
99103
assert_eq!(result, INPUT);
100104
}
101105

@@ -120,7 +124,8 @@ mod tests {
120124
];
121125

122126
let result =
123-
decompress_multi(&input, &mut writer, &einfo_list).unwrap();
127+
decompress_multi(&input, &mut writer, &mut einfo_list.iter())
128+
.unwrap();
124129
assert_eq!(result, INPUT);
125130
}
126131

@@ -134,7 +139,8 @@ mod tests {
134139
vec![ContentEncoding::Deflate, ContentEncoding::Brotli],
135140
)];
136141
let result =
137-
decompress_multi(&input, &mut writer, &einfo_list).unwrap_err();
142+
decompress_multi(&input, &mut writer, &mut einfo_list.iter())
143+
.unwrap_err();
138144
if let MultiDecompressErrorReason::Partial {
139145
partial_body,
140146
header_index,
@@ -164,7 +170,8 @@ mod tests {
164170
],
165171
)];
166172
let result =
167-
decompress_multi(&input, &mut writer, &einfo_list).unwrap_err();
173+
decompress_multi(&input, &mut writer, &mut einfo_list.iter())
174+
.unwrap_err();
168175
if let MultiDecompressErrorReason::Partial {
169176
partial_body,
170177
header_index,
@@ -187,7 +194,8 @@ mod tests {
187194
EncodingInfo::new(4, vec![ContentEncoding::Brotli]),
188195
];
189196
let result =
190-
decompress_multi(&input, &mut writer, &einfo_list).unwrap_err();
197+
decompress_multi(&input, &mut writer, &mut einfo_list.iter())
198+
.unwrap_err();
191199
if let MultiDecompressErrorReason::Partial {
192200
partial_body,
193201
header_index,
@@ -214,7 +222,8 @@ mod tests {
214222
EncodingInfo::new(5, vec![ContentEncoding::Identity]),
215223
];
216224
let result =
217-
decompress_multi(&input, &mut writer, &einfo_list).unwrap_err();
225+
decompress_multi(&input, &mut writer, &mut einfo_list.iter())
226+
.unwrap_err();
218227
if let MultiDecompressErrorReason::Partial {
219228
partial_body,
220229
header_index,
@@ -234,7 +243,8 @@ mod tests {
234243
let einfo_list =
235244
vec![EncodingInfo::new(0, vec![ContentEncoding::Zstd])];
236245
let result =
237-
decompress_multi(INPUT, &mut writer, &einfo_list).unwrap_err();
246+
decompress_multi(INPUT, &mut writer, &mut einfo_list.iter())
247+
.unwrap_err();
238248
assert!(matches!(result.reason, MultiDecompressErrorReason::Corrupt));
239249
}
240250

@@ -248,7 +258,8 @@ mod tests {
248258
];
249259

250260
let result =
251-
decompress_multi(INPUT, &mut writer, &einfo_list).unwrap_err();
261+
decompress_multi(INPUT, &mut writer, &mut einfo_list.iter())
262+
.unwrap_err();
252263
assert!(matches!(result.reason, MultiDecompressErrorReason::Corrupt));
253264
}
254265
}

decompression-plz/src/dstruct.rs

Lines changed: 21 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ impl<'a> DecompressionStruct<'a> {
9797
decompress_multi(
9898
self.extra.as_ref().unwrap().as_ref(),
9999
&mut self.writer,
100-
&self.encoding_info,
100+
&mut self.encoding_info.iter(),
101101
)
102102
}
103103

@@ -107,7 +107,7 @@ impl<'a> DecompressionStruct<'a> {
107107
decompress_multi(
108108
self.main.as_ref(),
109109
&mut self.writer,
110-
&self.encoding_info,
110+
&mut self.encoding_info.iter(),
111111
)
112112
}
113113

@@ -171,22 +171,25 @@ impl<'a> DecompressionStruct<'a> {
171171
mut input: BytesMut,
172172
last_encoding: ContentEncoding,
173173
) -> Result<BytesMut, MultiDecompressError> {
174-
decompress_multi(&input, &mut self.writer, &self.encoding_info)
175-
.map_err(|e| {
176-
self.push_last_encoding(last_encoding);
177-
if e.is_corrupt() {
178-
// when index = 0
179-
let header_index = self.encoding_info.len() - 1;
180-
let compression_index = self.last_compression_index() - 1;
181-
let partial_error = e.from_corrupt_to_partial(
182-
input,
183-
header_index,
184-
compression_index,
185-
);
186-
return partial_error;
187-
}
188-
e
189-
})
174+
let iter = &mut self
175+
.encoding_info
176+
.iter()
177+
.filter(|einfo| !einfo.encodings().is_empty());
178+
decompress_multi(&input, &mut self.writer, iter).map_err(|e| {
179+
self.push_last_encoding(last_encoding);
180+
if e.is_corrupt() {
181+
// when index = 0
182+
let header_index = self.encoding_info.len() - 1;
183+
let compression_index = self.last_compression_index() - 1;
184+
let partial_error = e.from_corrupt_to_partial(
185+
input,
186+
header_index,
187+
compression_index,
188+
);
189+
return partial_error;
190+
}
191+
e
192+
})
190193
}
191194
}
192195

0 commit comments

Comments
 (0)