@@ -209,8 +209,14 @@ impl fmt::Debug for Field {
209
209
pub ( crate ) struct InnerField {
210
210
/// Payload is initialized as Some and is `take`n when the field stream finishes.
211
211
payload : Option < PayloadRef > ,
212
+
213
+ /// Field boundary (without "--" prefix).
212
214
boundary : String ,
215
+
216
+ /// True if request payload has been exhausted.
213
217
eof : bool ,
218
+
219
+ /// Field data's stated size according to it's Content-Length header.
214
220
length : Option < u64 > ,
215
221
}
216
222
@@ -286,6 +292,7 @@ impl InnerField {
286
292
let mut pos = 0 ;
287
293
288
294
let len = payload. buf . len ( ) ;
295
+
289
296
if len == 0 {
290
297
return if payload. eof {
291
298
Poll :: Ready ( Some ( Err ( Error :: Incomplete ) ) )
@@ -296,7 +303,7 @@ impl InnerField {
296
303
297
304
// check boundary
298
305
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"--" {
300
307
Some ( 4 )
301
308
} else if & payload. buf [ 1 ..3 ] == b"--" {
302
309
Some ( 3 )
@@ -357,41 +364,42 @@ impl InnerField {
357
364
return Poll :: Ready ( None ) ;
358
365
}
359
366
360
- let result = if let Some ( mut payload) = self
367
+ let Some ( mut payload) = self
361
368
. payload
362
369
. as_ref ( )
363
370
. expect ( "Field should not be polled after completion" )
364
371
. 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 ,
379
387
}
388
+ }
380
389
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" ) ;
388
395
}
389
- Err ( err ) => Poll :: Ready ( Some ( Err ( err ) ) ) ,
396
+ Poll :: Ready ( None )
390
397
}
391
- } else {
392
- Poll :: Pending
398
+ Err ( err) => Poll :: Ready ( Some ( Err ( err) ) ) ,
393
399
} ;
394
400
401
+ drop ( payload) ;
402
+
395
403
if let Poll :: Ready ( None ) = result {
396
404
// drop payload buffer and make future un-poll-able
397
405
let _ = self . payload . take ( ) ;
0 commit comments