Skip to content

Commit e9ccfbc

Browse files
committed
refactor(multipart): clean up InnerField::poll
1 parent e0e4d1e commit e9ccfbc

File tree

1 file changed

+34
-26
lines changed

1 file changed

+34
-26
lines changed

actix-multipart/src/field.rs

Lines changed: 34 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -209,8 +209,14 @@ impl fmt::Debug for Field {
209209
pub(crate) struct InnerField {
210210
/// Payload is initialized as Some and is `take`n when the field stream finishes.
211211
payload: Option<PayloadRef>,
212+
213+
/// Field boundary (without "--" prefix).
212214
boundary: String,
215+
216+
/// True if request payload has been exhausted.
213217
eof: bool,
218+
219+
/// Field data's stated size according to it's Content-Length header.
214220
length: Option<u64>,
215221
}
216222

@@ -286,6 +292,7 @@ impl InnerField {
286292
let mut pos = 0;
287293

288294
let len = payload.buf.len();
295+
289296
if len == 0 {
290297
return if payload.eof {
291298
Poll::Ready(Some(Err(Error::Incomplete)))
@@ -296,7 +303,7 @@ impl InnerField {
296303

297304
// check boundary
298305
if len > 4 && payload.buf[0] == b'\r' {
299-
let b_len = if &payload.buf[..2] == b"\r\n" && &payload.buf[2..4] == b"--" {
306+
let b_len = if payload.buf.starts_with(b"\r\n") && &payload.buf[2..4] == b"--" {
300307
Some(4)
301308
} else if &payload.buf[1..3] == b"--" {
302309
Some(3)
@@ -357,41 +364,42 @@ impl InnerField {
357364
return Poll::Ready(None);
358365
}
359366

360-
let result = if let Some(mut payload) = self
367+
let Some(mut payload) = self
361368
.payload
362369
.as_ref()
363370
.expect("Field should not be polled after completion")
364371
.get_mut(safety)
365-
{
366-
if !self.eof {
367-
let res = if let Some(ref mut len) = self.length {
368-
InnerField::read_len(&mut payload, len)
369-
} else {
370-
InnerField::read_stream(&mut payload, &self.boundary)
371-
};
372-
373-
match res {
374-
Poll::Pending => return Poll::Pending,
375-
Poll::Ready(Some(Ok(bytes))) => return Poll::Ready(Some(Ok(bytes))),
376-
Poll::Ready(Some(Err(err))) => return Poll::Ready(Some(Err(err))),
377-
Poll::Ready(None) => self.eof = true,
378-
}
372+
else {
373+
return Poll::Pending;
374+
};
375+
376+
if !self.eof {
377+
let res = if let Some(ref mut len) = self.length {
378+
Self::read_len(&mut payload, len)
379+
} else {
380+
Self::read_stream(&mut payload, &self.boundary)
381+
};
382+
383+
match ready!(res) {
384+
Some(Ok(bytes)) => return Poll::Ready(Some(Ok(bytes))),
385+
Some(Err(err)) => return Poll::Ready(Some(Err(err))),
386+
None => self.eof = true,
379387
}
388+
}
380389

381-
match payload.readline() {
382-
Ok(None) => Poll::Pending,
383-
Ok(Some(line)) => {
384-
if line.as_ref() != b"\r\n" {
385-
log::warn!("multipart field did not read all the data or it is malformed");
386-
}
387-
Poll::Ready(None)
390+
let result = match payload.readline() {
391+
Ok(None) => Poll::Pending,
392+
Ok(Some(line)) => {
393+
if line.as_ref() != b"\r\n" {
394+
log::warn!("multipart field did not read all the data or it is malformed");
388395
}
389-
Err(err) => Poll::Ready(Some(Err(err))),
396+
Poll::Ready(None)
390397
}
391-
} else {
392-
Poll::Pending
398+
Err(err) => Poll::Ready(Some(Err(err))),
393399
};
394400

401+
drop(payload);
402+
395403
if let Poll::Ready(None) = result {
396404
// drop payload buffer and make future un-poll-able
397405
let _ = self.payload.take();

0 commit comments

Comments
 (0)