@@ -48,10 +48,12 @@ impl<R: Reader> Reader for LimitReader<R> {
48
48
}
49
49
50
50
let len = cmp:: min ( self . limit , buf. len ( ) ) ;
51
- self . inner . read ( buf. mut_slice_to ( len) ) . map ( |len| {
52
- self . limit -= len;
53
- len
54
- } )
51
+ let res = self . inner . read ( buf. mut_slice_to ( len) ) ;
52
+ match res {
53
+ Ok ( len) => self . limit -= len,
54
+ _ => { }
55
+ }
56
+ res
55
57
}
56
58
}
57
59
@@ -67,6 +69,8 @@ impl<R: Buffer> Buffer for LimitReader<R> {
67
69
}
68
70
69
71
fn consume ( & mut self , amt : uint ) {
72
+ // Don't let callers reset the limit by passing an overlarge value
73
+ let amt = cmp:: min ( amt, self . limit ) ;
70
74
self . limit -= amt;
71
75
self . inner . consume ( amt) ;
72
76
}
@@ -97,6 +101,7 @@ impl Buffer for ZeroReader {
97
101
static DATA : [ u8 , ..64 ] = [ 0 , ..64 ] ;
98
102
Ok ( DATA . as_slice ( ) )
99
103
}
104
+
100
105
fn consume ( & mut self , _amt : uint ) { }
101
106
}
102
107
@@ -117,7 +122,10 @@ impl Buffer for NullReader {
117
122
fn consume ( & mut self , _amt : uint ) { }
118
123
}
119
124
120
- /// A `Writer` which multiplexes writes to a set of `Writers`.
125
+ /// A `Writer` which multiplexes writes to a set of `Writer`s.
126
+ ///
127
+ /// The `Writer`s are delegated to in order. If any `Writer` returns an error,
128
+ /// that error is returned immediately and remaining `Writer`s are not called.
121
129
pub struct MultiWriter {
122
130
writers : Vec < Box < Writer > >
123
131
}
@@ -132,24 +140,22 @@ impl MultiWriter {
132
140
impl Writer for MultiWriter {
133
141
#[ inline]
134
142
fn write ( & mut self , buf : & [ u8 ] ) -> io:: IoResult < ( ) > {
135
- let mut ret = Ok ( ( ) ) ;
136
143
for writer in self . writers . mut_iter ( ) {
137
- ret = ret . and ( writer. write ( buf) ) ;
144
+ try! ( writer. write ( buf) ) ;
138
145
}
139
- return ret ;
146
+ Ok ( ( ) )
140
147
}
141
148
142
149
#[ inline]
143
150
fn flush ( & mut self ) -> io:: IoResult < ( ) > {
144
- let mut ret = Ok ( ( ) ) ;
145
151
for writer in self . writers . mut_iter ( ) {
146
- ret = ret . and ( writer. flush ( ) ) ;
152
+ try! ( writer. flush ( ) ) ;
147
153
}
148
- return ret ;
154
+ Ok ( ( ) )
149
155
}
150
156
}
151
157
152
- /// A `Reader` which chains input from multiple `Readers` , reading each to
158
+ /// A `Reader` which chains input from multiple `Reader`s , reading each to
153
159
/// completion before moving onto the next.
154
160
pub struct ChainedReader < I , R > {
155
161
readers : I ,
@@ -229,17 +235,16 @@ pub fn copy<R: Reader, W: Writer>(r: &mut R, w: &mut W) -> io::IoResult<()> {
229
235
}
230
236
}
231
237
232
- /// A `Reader` which converts an `Iterator<u8>` into a `Reader`.
238
+ /// An adaptor converting an `Iterator<u8>` to a `Reader`.
233
239
pub struct IterReader < T > {
234
240
iter : T ,
235
241
}
236
242
237
243
impl < T : Iterator < u8 > > IterReader < T > {
238
- /// Create a new `IterReader` which will read from the specified `Iterator`.
244
+ /// Creates a new `IterReader` which will read from the specified
245
+ /// `Iterator`.
239
246
pub fn new ( iter : T ) -> IterReader < T > {
240
- IterReader {
241
- iter : iter,
242
- }
247
+ IterReader { iter : iter }
243
248
}
244
249
}
245
250
@@ -251,7 +256,7 @@ impl<T: Iterator<u8>> Reader for IterReader<T> {
251
256
* slot = elt;
252
257
len += 1 ;
253
258
}
254
- if len == 0 {
259
+ if len == 0 && buf . len ( ) != 0 {
255
260
Err ( io:: standard_error ( io:: EndOfFile ) )
256
261
} else {
257
262
Ok ( len)
@@ -297,6 +302,14 @@ mod test {
297
302
assert_eq ! ( 0 , r. limit( ) ) ;
298
303
}
299
304
305
+ #[ test]
306
+ fn test_limit_reader_overlong_consume ( ) {
307
+ let mut r = MemReader :: new ( vec ! [ 0 , 1 , 2 , 3 , 4 , 5 ] ) ;
308
+ let mut r = LimitReader :: new ( r. by_ref ( ) , 1 ) ;
309
+ r. consume ( 2 ) ;
310
+ assert_eq ! ( vec![ ] , r. read_to_end( ) . unwrap( ) ) ;
311
+ }
312
+
300
313
#[ test]
301
314
fn test_null_writer ( ) {
302
315
let mut s = NullWriter ;
@@ -415,4 +428,11 @@ mod test {
415
428
416
429
assert_eq ! ( r. read( buf) . unwrap_err( ) . kind, io:: EndOfFile ) ;
417
430
}
431
+
432
+ #[ test]
433
+ fn iter_reader_zero_length ( ) {
434
+ let mut r = IterReader :: new ( range ( 0u8 , 8 ) ) ;
435
+ let mut buf = [ ] ;
436
+ assert_eq ! ( Ok ( 0 ) , r. read( buf) ) ;
437
+ }
418
438
}
0 commit comments