@@ -114,17 +114,16 @@ where
114
114
where
115
115
R : Reader + ?Sized ,
116
116
{
117
- // enable reader checks
118
- let mut reader = reader. with_checks ( ) ;
119
- let reader = & mut reader;
120
-
121
117
let final_offset = reader. final_offset ( ) ;
122
118
123
119
{
124
120
// if the storage specializes writing zero-copy Bytes/BytesMut, then just write to the
125
121
// receive buffer, since that's what it stores
126
122
let mut should_delegate = C :: SPECIALIZES_BYTES || C :: SPECIALIZES_BYTES_MUT ;
127
123
124
+ // if the storage is empty then write into the duplex
125
+ should_delegate |= !self . storage . has_remaining_capacity ( ) ;
126
+
128
127
// if this packet is non-contiguous, then delegate to the wrapped writer
129
128
should_delegate |= reader. current_offset ( ) != self . duplex . current_offset ( ) ;
130
129
@@ -148,7 +147,7 @@ where
148
147
149
148
{
150
149
// track the number of consumed bytes
151
- let mut reader = reader. tracked ( ) ;
150
+ let mut reader = reader. track_read ( ) ;
152
151
153
152
reader. copy_into ( self . storage ) ?;
154
153
@@ -169,3 +168,99 @@ where
169
168
Ok ( ( ) )
170
169
}
171
170
}
171
+
172
+ #[ cfg( test) ]
173
+ mod tests {
174
+ use super :: * ;
175
+ use crate :: {
176
+ buffer:: {
177
+ reader:: Reader ,
178
+ writer:: { Storage as _, Writer } ,
179
+ Reassembler ,
180
+ } ,
181
+ stream:: testing:: Data ,
182
+ } ;
183
+
184
+ #[ test]
185
+ fn split_test ( ) {
186
+ let mut duplex = Reassembler :: default ( ) ;
187
+ let mut reader = Data :: new ( 10_000 ) ;
188
+ let mut checker = reader;
189
+
190
+ {
191
+ let mut storage: Vec < u8 > = vec ! [ ] ;
192
+
193
+ let mut split = Split :: new ( & mut storage, & mut duplex) ;
194
+
195
+ let mut reader = reader. with_read_limit ( 5 ) ;
196
+ split. read_from ( & mut reader) . unwrap ( ) ;
197
+
198
+ assert_eq ! ( storage. len( ) , 5 ) ;
199
+ assert_eq ! ( duplex. current_offset( ) . as_u64( ) , 5 ) ;
200
+
201
+ checker. receive ( & [ & storage[ ..] ] ) ;
202
+ }
203
+
204
+ {
205
+ let mut storage = writer:: storage:: Empty ;
206
+
207
+ let mut split = Split :: new ( & mut storage, & mut duplex) ;
208
+
209
+ let mut reader = reader. with_read_limit ( 5 ) ;
210
+ split. read_from ( & mut reader) . unwrap ( ) ;
211
+
212
+ assert_eq ! ( duplex. current_offset( ) . as_u64( ) , 5 ) ;
213
+ assert_eq ! ( duplex. len( ) , 5 ) ;
214
+ }
215
+
216
+ {
217
+ let mut storage: Vec < u8 > = vec ! [ ] ;
218
+
219
+ let mut split = Split :: new ( & mut storage, & mut duplex) ;
220
+
221
+ let mut reader = reader. with_read_limit ( 5 ) ;
222
+ split. read_from ( & mut reader) . unwrap ( ) ;
223
+
224
+ // make sure we didn't write to the storage, even if we had capacity, since the
225
+ // current_offset doesn't match
226
+ assert ! ( storage. is_empty( ) ) ;
227
+ assert_eq ! ( duplex. current_offset( ) . as_u64( ) , 5 ) ;
228
+
229
+ // move the reassembled bytes into the checker
230
+ checker. read_from ( & mut duplex) . unwrap ( ) ;
231
+ assert_eq ! ( duplex. current_offset( ) . as_u64( ) , 15 ) ;
232
+ }
233
+
234
+ {
235
+ let mut storage: Vec < u8 > = vec ! [ ] ;
236
+ {
237
+ let mut storage = storage. with_write_limit ( 1 ) ;
238
+
239
+ let mut split = Split :: new ( & mut storage, & mut duplex) ;
240
+
241
+ let mut reader = reader. with_read_limit ( 10 ) ;
242
+ split. read_from ( & mut reader) . unwrap ( ) ;
243
+ }
244
+
245
+ // the storage was too small so we delegated to duplex
246
+ assert ! ( storage. is_empty( ) ) ;
247
+ assert_eq ! ( duplex. len( ) , 10 ) ;
248
+
249
+ // move the reassembled bytes into the checker
250
+ checker. read_from ( & mut duplex) . unwrap ( ) ;
251
+ assert_eq ! ( duplex. current_offset( ) . as_u64( ) , 25 ) ;
252
+ }
253
+
254
+ {
255
+ let mut storage = writer:: storage:: Empty ;
256
+
257
+ let mut split = Split :: new ( & mut storage, & mut duplex) ;
258
+
259
+ let mut reader = reader. with_read_limit ( 1 ) ;
260
+ split. read_from ( & mut reader) . unwrap ( ) ;
261
+
262
+ assert_eq ! ( duplex. current_offset( ) . as_u64( ) , 25 ) ;
263
+ assert_eq ! ( duplex. len( ) , 1 ) ;
264
+ }
265
+ }
266
+ }
0 commit comments