@@ -65,49 +65,43 @@ impl<R: AsyncBufRead, D: Decode> Decoder<R, D> {
65
65
) -> Poll < Result < ( ) > > {
66
66
let mut this = self . project ( ) ;
67
67
68
+ let mut first = true ;
69
+
68
70
loop {
69
71
* this. state = match this. state {
70
72
State :: Decoding => {
71
- let fill_buf_result = this. reader . as_mut ( ) . poll_fill_buf ( cx) ;
72
-
73
- match fill_buf_result {
74
- Poll :: Pending => {
75
- // Try to decode even if there is no new data.
76
- // Some data may be left in the internal state of the decoder
77
- // because there was not enough space in the output buffer.
78
- let written_before = output. written ( ) . len ( ) ;
79
-
80
- let mut input: Vec < u8 > = vec ! [ ] ;
81
- let mut input = PartialBuffer :: new ( input) ;
82
- let done = this. decoder . decode ( & mut input, output) ?;
83
- if output. written ( ) . len ( ) == written_before {
84
- return Poll :: Pending ;
85
- }
73
+ let input = if first {
74
+ & [ ] [ ..]
75
+ } else {
76
+ ready ! ( this. reader. as_mut( ) . poll_fill_buf( cx) ) ?
77
+ } ;
86
78
87
- if done {
88
- State :: Flushing
89
- } else {
90
- State :: Decoding
91
- }
92
- }
93
- Poll :: Ready ( input ) => {
94
- let input = input? ;
95
- if input. is_empty ( ) {
96
- // Avoid attempting to reinitialise the decoder if the reader
97
- // has returned EOF.
98
- * this . multiple_members = false ;
99
- State :: Flushing
79
+ if input . is_empty ( ) && !first {
80
+ // Avoid attempting to reinitialise the decoder if the reader
81
+ // has returned EOF.
82
+ * this . multiple_members = false ;
83
+
84
+ State :: Flushing
85
+ } else {
86
+ let mut input = PartialBuffer :: new ( input) ;
87
+ let done = this . decoder . decode ( & mut input, output ) . or_else ( |err| {
88
+ // ignore the first error, occurs when input is empty
89
+ // but we need to run decode to flush
90
+ if first {
91
+ Ok ( false )
100
92
} else {
101
- let mut input = PartialBuffer :: new ( input) ;
102
- let done = this. decoder . decode ( & mut input, output) ?;
103
- let len = input. written ( ) . len ( ) ;
104
- this. reader . as_mut ( ) . consume ( len) ;
105
- if done {
106
- State :: Flushing
107
- } else {
108
- State :: Decoding
109
- }
93
+ Err ( err)
110
94
}
95
+ } ) ?;
96
+
97
+ first = false ;
98
+
99
+ let len = input. written ( ) . len ( ) ;
100
+ this. reader . as_mut ( ) . consume ( len) ;
101
+ if done {
102
+ State :: Flushing
103
+ } else {
104
+ State :: Decoding
111
105
}
112
106
}
113
107
}
0 commit comments