Skip to content

Commit ff0b4e9

Browse files
committed
Factorize proto read methods
1 parent 226fe0b commit ff0b4e9

File tree

1 file changed

+37
-58
lines changed

1 file changed

+37
-58
lines changed

quinn-proto/src/connection/streams.rs

+37-58
Original file line numberDiff line numberDiff line change
@@ -177,80 +177,59 @@ impl Streams {
177177
}
178178

179179
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+
}))
205186
}
206187

207188
pub fn read_unordered(
208189
&mut self,
209190
id: StreamId,
210191
) -> 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,
230200
}
231-
Err(e @ ReadError::Reset { .. }) => {
232-
entry.remove_entry();
233-
Err(e)
234-
}
235-
Err(e) => Err(e),
236-
}
201+
}))
237202
}
238203

239204
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+
{
240224
let mut entry = match self.recv.entry(id) {
241225
hash_map::Entry::Vacant(_) => return Err(ReadError::UnknownStream),
242226
hash_map::Entry::Occupied(e) => e,
243227
};
244228
let rs = entry.get_mut();
245-
match rs.read_chunk() {
246-
Ok(Some(chunk)) => {
229+
match read(rs) {
230+
Ok(Some(res)) => {
247231
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)))
254233
}
255234
Ok(None) => {
256235
entry.remove_entry();

0 commit comments

Comments
 (0)