@@ -31,7 +31,6 @@ pub use self::{
31
31
32
32
use std:: io:: Read ;
33
33
34
- use byteorder:: { LittleEndian , ReadBytesExt } ;
35
34
use chrono:: {
36
35
offset:: { LocalResult , TimeZone } ,
37
36
Utc ,
79
78
}
80
79
81
80
fn read_string < R : Read + ?Sized > ( reader : & mut R , utf8_lossy : bool ) -> Result < String > {
82
- let len = reader . read_i32 :: < LittleEndian > ( ) ?;
81
+ let len = read_i32 ( reader ) ?;
83
82
84
83
// UTF-8 String must have at least 1 byte (the last 0x00).
85
84
if len < 1 {
@@ -100,7 +99,7 @@ fn read_string<R: Read + ?Sized>(reader: &mut R, utf8_lossy: bool) -> Result<Str
100
99
} ;
101
100
102
101
// read the null terminator
103
- if reader . read_u8 ( ) ? != 0 {
102
+ if read_u8 ( reader ) ? != 0 {
104
103
return Err ( Error :: invalid_length (
105
104
len as usize ,
106
105
& "contents of string longer than provided length" ,
@@ -114,7 +113,7 @@ fn read_cstring<R: Read + ?Sized>(reader: &mut R) -> Result<String> {
114
113
let mut v = Vec :: new ( ) ;
115
114
116
115
loop {
117
- let c = reader . read_u8 ( ) ?;
116
+ let c = read_u8 ( reader ) ?;
118
117
if c == 0 {
119
118
break ;
120
119
}
@@ -124,14 +123,32 @@ fn read_cstring<R: Read + ?Sized>(reader: &mut R) -> Result<String> {
124
123
Ok ( String :: from_utf8 ( v) ?)
125
124
}
126
125
126
+ #[ inline]
127
+ fn read_u8 < R : Read + ?Sized > ( reader : & mut R ) -> Result < u8 > {
128
+ let mut buf = [ 0 ; 1 ] ;
129
+ reader. read_exact ( & mut buf) ?;
130
+ Ok ( u8:: from_le_bytes ( buf) )
131
+ }
132
+
127
133
#[ inline]
128
134
pub ( crate ) fn read_i32 < R : Read + ?Sized > ( reader : & mut R ) -> Result < i32 > {
129
- reader. read_i32 :: < LittleEndian > ( ) . map_err ( From :: from)
135
+ let mut buf = [ 0 ; 4 ] ;
136
+ reader. read_exact ( & mut buf) ?;
137
+ Ok ( i32:: from_le_bytes ( buf) )
130
138
}
131
139
132
140
#[ inline]
133
141
fn read_i64 < R : Read + ?Sized > ( reader : & mut R ) -> Result < i64 > {
134
- reader. read_i64 :: < LittleEndian > ( ) . map_err ( From :: from)
142
+ let mut buf = [ 0 ; 8 ] ;
143
+ reader. read_exact ( & mut buf) ?;
144
+ Ok ( i64:: from_le_bytes ( buf) )
145
+ }
146
+
147
+ #[ inline]
148
+ fn read_f64 < R : Read + ?Sized > ( reader : & mut R ) -> Result < f64 > {
149
+ let mut buf = [ 0 ; 8 ] ;
150
+ reader. read_exact ( & mut buf) ?;
151
+ Ok ( f64:: from_le_bytes ( buf) )
135
152
}
136
153
137
154
/// Placeholder decoder for `Decimal128`. Reads 128 bits and just stores them, does no validation or
@@ -165,7 +182,7 @@ fn deserialize_array<R: Read + ?Sized>(reader: &mut R, utf8_lossy: bool) -> Resu
165
182
"array length longer than contents" ,
166
183
|cursor| {
167
184
loop {
168
- let tag = cursor . read_u8 ( ) ?;
185
+ let tag = read_u8 ( cursor ) ?;
169
186
if tag == 0 {
170
187
break ;
171
188
}
@@ -189,7 +206,7 @@ pub(crate) fn deserialize_bson_kvp<R: Read + ?Sized>(
189
206
let key = read_cstring ( reader) ?;
190
207
191
208
let val = match ElementType :: from ( tag) {
192
- Some ( ElementType :: Double ) => Bson :: Double ( reader . read_f64 :: < LittleEndian > ( ) ?) ,
209
+ Some ( ElementType :: Double ) => Bson :: Double ( read_f64 ( reader ) ?) ,
193
210
Some ( ElementType :: String ) => read_string ( reader, utf8_lossy) . map ( Bson :: String ) ?,
194
211
Some ( ElementType :: EmbeddedDocument ) => Document :: from_reader ( reader) . map ( Bson :: Document ) ?,
195
212
Some ( ElementType :: Array ) => deserialize_array ( reader, utf8_lossy) . map ( Bson :: Array ) ?,
@@ -201,7 +218,7 @@ pub(crate) fn deserialize_bson_kvp<R: Read + ?Sized>(
201
218
& format ! ( "binary length must be between 0 and {}" , MAX_BSON_SIZE ) . as_str ( ) ,
202
219
) ) ;
203
220
}
204
- let subtype = BinarySubtype :: from ( reader . read_u8 ( ) ?) ;
221
+ let subtype = BinarySubtype :: from ( read_u8 ( reader ) ?) ;
205
222
206
223
// Skip length data in old binary.
207
224
if let BinarySubtype :: BinaryOld = subtype {
@@ -225,12 +242,12 @@ pub(crate) fn deserialize_bson_kvp<R: Read + ?Sized>(
225
242
Some ( ElementType :: ObjectId ) => {
226
243
let mut objid = [ 0 ; 12 ] ;
227
244
for x in & mut objid {
228
- * x = reader . read_u8 ( ) ?;
245
+ * x = read_u8 ( reader ) ?;
229
246
}
230
247
Bson :: ObjectId ( oid:: ObjectId :: with_bytes ( objid) )
231
248
}
232
249
Some ( ElementType :: Boolean ) => {
233
- let val = reader . read_u8 ( ) ?;
250
+ let val = read_u8 ( reader ) ?;
234
251
if val > 1 {
235
252
return Err ( Error :: invalid_value (
236
253
Unexpected :: Unsigned ( val as u64 ) ,
0 commit comments