@@ -177,80 +177,59 @@ impl Streams {
177
177
}
178
178
179
179
pub fn read ( & mut self , id : StreamId , buf : & mut [ u8 ] ) -> Result < Option < ReadResult > , ReadError > {
180
- let mut entry = match self . recv . entry ( id) {
181
- hash_map:: Entry :: Vacant ( _) => return Err ( ReadError :: UnknownStream ) ,
182
- hash_map:: Entry :: Occupied ( e) => e,
183
- } ;
184
- let rs = entry. get_mut ( ) ;
185
- match rs. read ( buf) {
186
- Ok ( Some ( len) ) => {
187
- let ( _, transmit_max_stream_data) = rs. max_stream_data ( self . stream_receive_window ) ;
188
- let transmit_max_data = self . add_read_credits ( len as u64 ) ;
189
- Ok ( Some ( ReadResult {
190
- len,
191
- max_stream_data : transmit_max_stream_data,
192
- max_data : transmit_max_data,
193
- } ) )
194
- }
195
- Ok ( None ) => {
196
- entry. remove_entry ( ) ;
197
- Ok ( None )
198
- }
199
- Err ( e @ ReadError :: Reset { .. } ) => {
200
- entry. remove_entry ( ) ;
201
- Err ( e)
202
- }
203
- Err ( e) => Err ( e) ,
204
- }
180
+ let res = self . try_read ( id, |rs : & mut Recv | rs. read ( buf) ) ?;
181
+ Ok ( res. map ( |( len, max_stream_data) | ReadResult {
182
+ len,
183
+ max_stream_data,
184
+ max_data : self . add_read_credits ( len as u64 ) ,
185
+ } ) )
205
186
}
206
187
207
188
pub fn read_unordered (
208
189
& mut self ,
209
190
id : StreamId ,
210
191
) -> Result < Option < ReadUnorderedResult > , ReadError > {
211
- let mut entry = match self . recv . entry ( id) {
212
- hash_map:: Entry :: Vacant ( _) => return Err ( ReadError :: UnknownStream ) ,
213
- hash_map:: Entry :: Occupied ( e) => e,
214
- } ;
215
- let rs = entry. get_mut ( ) ;
216
- match rs. read_unordered ( ) {
217
- Ok ( Some ( ( buf, offset) ) ) => {
218
- let ( _, transmit_max_stream_data) = rs. max_stream_data ( self . stream_receive_window ) ;
219
- let transmit_max_data = self . add_read_credits ( buf. len ( ) as u64 ) ;
220
- Ok ( Some ( ReadUnorderedResult {
221
- buf,
222
- offset,
223
- max_stream_data : transmit_max_stream_data,
224
- max_data : transmit_max_data,
225
- } ) )
226
- }
227
- Ok ( None ) => {
228
- entry. remove_entry ( ) ;
229
- Ok ( None )
192
+ let res = self . try_read ( id, |rs : & mut Recv | rs. read_unordered ( ) ) ?;
193
+ Ok ( res. map ( |( ( buf, offset) , max_stream_data) | {
194
+ let max_data = self . add_read_credits ( buf. len ( ) as u64 ) ;
195
+ ReadUnorderedResult {
196
+ buf,
197
+ offset,
198
+ max_stream_data,
199
+ max_data,
230
200
}
231
- Err ( e @ ReadError :: Reset { .. } ) => {
232
- entry. remove_entry ( ) ;
233
- Err ( e)
234
- }
235
- Err ( e) => Err ( e) ,
236
- }
201
+ } ) )
237
202
}
238
203
239
204
pub fn read_chunk ( & mut self , id : StreamId ) -> Result < Option < ReadChunkResult > , ReadError > {
205
+ let res = self . try_read ( id, |rs : & mut Recv | rs. read_chunk ( ) ) ?;
206
+ Ok ( res. map ( |( buf, max_stream_data) | {
207
+ let max_data = self . add_read_credits ( buf. len ( ) as u64 ) ;
208
+ ReadChunkResult {
209
+ buf,
210
+ max_stream_data,
211
+ max_data,
212
+ }
213
+ } ) )
214
+ }
215
+
216
+ fn try_read < T , U > (
217
+ & mut self ,
218
+ id : StreamId ,
219
+ mut read : T ,
220
+ ) -> Result < Option < ( U , ShouldTransmit ) > , ReadError >
221
+ where
222
+ T : FnMut ( & mut Recv ) -> Result < Option < U > , ReadError > ,
223
+ {
240
224
let mut entry = match self . recv . entry ( id) {
241
225
hash_map:: Entry :: Vacant ( _) => return Err ( ReadError :: UnknownStream ) ,
242
226
hash_map:: Entry :: Occupied ( e) => e,
243
227
} ;
244
228
let rs = entry. get_mut ( ) ;
245
- match rs . read_chunk ( ) {
246
- Ok ( Some ( chunk ) ) => {
229
+ match read ( rs ) {
230
+ Ok ( Some ( res ) ) => {
247
231
let ( _, transmit_max_stream_data) = rs. max_stream_data ( self . stream_receive_window ) ;
248
- let transmit_max_data = self . add_read_credits ( chunk. len ( ) as u64 ) ;
249
- Ok ( Some ( ReadChunkResult {
250
- buf : chunk,
251
- max_stream_data : transmit_max_stream_data,
252
- max_data : transmit_max_data,
253
- } ) )
232
+ Ok ( Some ( ( res, transmit_max_stream_data) ) )
254
233
}
255
234
Ok ( None ) => {
256
235
entry. remove_entry ( ) ;
0 commit comments