@@ -329,14 +329,9 @@ impl<'a, T: Read> Read for Buffer<'a, T> {
329
329
fn read ( & mut self , buf : & mut [ u8 ] ) -> io:: Result < usize > {
330
330
let mut len = self . buf . read ( buf) ?;
331
331
if buf. len ( ) > len {
332
- match self . reader . read ( & mut buf[ len..] ) ? {
333
- // eof
334
- 0 => return Err ( bad_header ( ) ) ,
335
- len2 => {
336
- self . buf . get_mut ( ) . get_mut ( ) . extend_from_slice ( & buf[ len..] [ ..len2] ) ;
337
- len += len2;
338
- }
339
- }
332
+ let len2 = self . reader . read ( & mut buf[ len..] ) ?;
333
+ self . buf . get_mut ( ) . get_mut ( ) . extend_from_slice ( & buf[ len..] [ ..len2] ) ;
334
+ len += len2;
340
335
}
341
336
Ok ( len)
342
337
}
@@ -360,7 +355,6 @@ impl<R: BufRead> GzDecoder<R> {
360
355
GzState :: Body
361
356
} ,
362
357
Err ( ref err) if io:: ErrorKind :: WouldBlock == err. kind ( )
363
- || io:: ErrorKind :: UnexpectedEof == err. kind ( )
364
358
=> GzState :: Header ( buf) ,
365
359
Err ( err) => GzState :: Err ( err)
366
360
} ;
@@ -408,96 +402,96 @@ impl<R: BufRead> Read for GzDecoder<R> {
408
402
fn read ( & mut self , into : & mut [ u8 ] ) -> io:: Result < usize > {
409
403
let GzDecoder { inner, header, reader, multi } = self ;
410
404
411
- enum Next {
412
- None ,
413
- Header ,
414
- Body ,
415
- Finished ,
416
- Err ( io:: Error ) ,
417
- End
418
- }
419
-
420
- let mut next = Next :: None ;
421
-
422
405
loop {
423
- match inner {
424
- GzState :: Header ( buf) => {
425
- let mut reader = Buffer :: new ( buf, reader. get_mut ( ) . get_mut ( ) ) ;
426
- match read_gz_header ( & mut reader) {
427
- Ok ( hdr) => {
428
- * header = Some ( hdr) ;
429
- next = Next :: Body ;
430
- } ,
431
- Err ( ref err) if io:: ErrorKind :: WouldBlock == err. kind ( )
432
- || io:: ErrorKind :: UnexpectedEof == err. kind ( )
433
- => return Err ( io:: ErrorKind :: WouldBlock . into ( ) ) ,
434
- Err ( err) => next = Next :: Err ( err)
435
- }
406
+ * inner = match mem:: replace ( inner, GzState :: End ) {
407
+ GzState :: Header ( mut buf) => {
408
+ let result = {
409
+ let mut reader = Buffer :: new ( & mut buf, reader. get_mut ( ) . get_mut ( ) ) ;
410
+ read_gz_header ( & mut reader)
411
+ } ;
412
+ let hdr = result
413
+ . map_err ( |err| {
414
+ if io:: ErrorKind :: WouldBlock == err. kind ( ) {
415
+ * inner = GzState :: Header ( buf) ;
416
+ }
417
+
418
+ err
419
+ } ) ?;
420
+ * header = Some ( hdr) ;
421
+ GzState :: Body
436
422
} ,
437
423
GzState :: Body => {
438
424
if into. is_empty ( ) {
425
+ * inner = GzState :: Body ;
439
426
return Ok ( 0 ) ;
440
427
}
441
428
442
- match reader. read ( into) ? {
443
- 0 => next = Next :: Finished ,
444
- n => return Ok ( n)
429
+ let n = reader. read ( into)
430
+ . map_err ( |err| {
431
+ if io:: ErrorKind :: WouldBlock == err. kind ( ) {
432
+ * inner = GzState :: Body ;
433
+ }
434
+
435
+ err
436
+ } ) ?;
437
+
438
+ match n {
439
+ 0 => GzState :: Finished ( 0 , [ 0 ; 8 ] ) ,
440
+ n => {
441
+ * inner = GzState :: Body ;
442
+ return Ok ( n) ;
443
+ }
445
444
}
446
445
} ,
447
- GzState :: Finished ( pos, buf) => if * pos < buf. len ( ) {
448
- match reader. get_mut ( ) . get_mut ( ) . read ( & mut buf[ * pos..] ) {
449
- Ok ( 0 ) => next = Next :: Err ( io:: ErrorKind :: UnexpectedEof . into ( ) ) ,
450
- Ok ( n) => * pos += n,
451
- Err ( err) => if io:: ErrorKind :: WouldBlock == err. kind ( ) {
452
- return Err ( err) ;
446
+ GzState :: Finished ( pos, mut buf) => if pos < buf. len ( ) {
447
+ let n = reader. get_mut ( ) . get_mut ( )
448
+ . read ( & mut buf[ pos..] )
449
+ . and_then ( |n| if n == 0 {
450
+ Err ( io:: ErrorKind :: UnexpectedEof . into ( ) )
453
451
} else {
454
- next = Next :: Err ( err) ;
455
- }
456
- }
457
- } else {
458
- let ( crc, amt) = finish ( buf) ;
459
-
460
- if crc != reader. crc ( ) . sum ( ) {
461
- next = Next :: Err ( corrupt ( ) ) ;
462
- } else if amt != reader. crc ( ) . amount ( ) {
463
- next = Next :: Err ( corrupt ( ) ) ;
464
- } else if !* multi {
465
- next = Next :: End ;
466
- } else {
467
- match reader. get_mut ( ) . get_mut ( ) . fill_buf ( ) {
468
- Ok ( buf) => if buf. is_empty ( ) {
469
- next = Next :: End ;
470
- } else {
471
- next = Next :: Header ;
472
- } ,
473
- Err ( err) => if io:: ErrorKind :: WouldBlock == err. kind ( ) {
474
- return Err ( err) ;
475
- } else {
476
- next = Next :: Err ( err) ;
452
+ Ok ( n)
453
+ } )
454
+ . map_err ( |err| {
455
+ if io:: ErrorKind :: WouldBlock == err. kind ( ) {
456
+ * inner = GzState :: Finished ( pos, buf) ;
477
457
}
458
+
459
+ err
460
+ } ) ?;
461
+
462
+ GzState :: Finished ( pos + n, buf)
463
+ } else {
464
+ let ( crc, amt) = finish ( & buf) ;
465
+
466
+ if crc != reader. crc ( ) . sum ( ) || amt != reader. crc ( ) . amount ( ) {
467
+ return Err ( corrupt ( ) ) ;
468
+ } else if * multi {
469
+ let is_eof = reader. get_mut ( ) . get_mut ( )
470
+ . fill_buf ( )
471
+ . map ( |buf| buf. is_empty ( ) )
472
+ . map_err ( |err| {
473
+ if io:: ErrorKind :: WouldBlock == err. kind ( ) {
474
+ * inner = GzState :: Finished ( pos, buf) ;
475
+ }
476
+
477
+ err
478
+ } ) ?;
479
+
480
+ if is_eof {
481
+ GzState :: End
482
+ } else {
483
+ reader. reset ( ) ;
484
+ reader. get_mut ( ) . reset_data ( ) ;
485
+ header. take ( ) ;
486
+ GzState :: Header ( Vec :: with_capacity ( 10 ) )
478
487
}
488
+ } else {
489
+ GzState :: End
479
490
}
480
491
} ,
481
- GzState :: Err ( err) => next = Next :: Err ( mem :: replace ( err, io :: ErrorKind :: Other . into ( ) ) ) ,
492
+ GzState :: Err ( err) => return Err ( err) ,
482
493
GzState :: End => return Ok ( 0 )
483
- }
484
-
485
- match mem:: replace ( & mut next, Next :: None ) {
486
- Next :: None => ( ) ,
487
- Next :: Header => {
488
- reader. reset ( ) ;
489
- reader. get_mut ( ) . reset_data ( ) ;
490
- header. take ( ) ;
491
- * inner = GzState :: Header ( Vec :: new ( ) ) ;
492
- } ,
493
- Next :: Body => * inner = GzState :: Body ,
494
- Next :: Finished => * inner = GzState :: Finished ( 0 , [ 0 ; 8 ] ) ,
495
- Next :: Err ( err) => {
496
- * inner = GzState :: End ;
497
- return Err ( err) ;
498
- } ,
499
- Next :: End => * inner = GzState :: End
500
- }
494
+ } ;
501
495
}
502
496
}
503
497
}
0 commit comments