@@ -99,7 +99,10 @@ impl<R: Read> BufReader<R> {
99
99
impl < R : Read + ?Sized > BufReader < R > {
100
100
/// Attempt to look ahead `n` bytes.
101
101
///
102
- /// `n` must be less than `capacity`.
102
+ /// `n` must be less than or equal to `capacity`.
103
+ ///
104
+ /// the returned slice may be less than `n` bytes long if
105
+ /// end of file is reached.
103
106
///
104
107
/// ## Examples
105
108
///
@@ -117,6 +120,7 @@ impl<R: Read + ?Sized> BufReader<R> {
117
120
/// let mut s = String::new();
118
121
/// rdr.read_to_string(&mut s).unwrap();
119
122
/// assert_eq!(&s, "hello");
123
+ /// assert_eq!(rdr.peek(1).unwrap().len(), 0);
120
124
/// ```
121
125
#[ unstable( feature = "bufreader_peek" , issue = "128405" ) ]
122
126
pub fn peek ( & mut self , n : usize ) -> io:: Result < & [ u8 ] > {
@@ -125,7 +129,11 @@ impl<R: Read + ?Sized> BufReader<R> {
125
129
if self . buf . pos ( ) > 0 {
126
130
self . buf . backshift ( ) ;
127
131
}
128
- self . buf . read_more ( & mut self . inner ) ?;
132
+ let new = self . buf . read_more ( & mut self . inner ) ?;
133
+ if new == 0 {
134
+ // end of file, no more bytes to read
135
+ return Ok ( & self . buf . buffer ( ) [ ..] ) ;
136
+ }
129
137
debug_assert_eq ! ( self . buf. pos( ) , 0 ) ;
130
138
}
131
139
Ok ( & self . buf . buffer ( ) [ ..n] )
0 commit comments